study_example/smart_pointer/
box_pointer.rs

1#[derive(Debug)]
2pub enum List {
3    // 定义为了Box,存了指向数据的指针,指针的大小也是确定的
4    Cons(i32, Box<List>),
5    Nil,
6}
7
8/// 运行结果为
9/// ```txt
10/// b = 180
11/// ```
12fn store_base_type_on_heap() {
13    // 正常i32会存储在栈上,这样将它存储在heap上;
14    let b = Box::new(180);
15    println!("b = {}", b);
16}
17
18/*
19    为了确定为 Message 值分配多少空间,Rust 会遍历每个变体以查看哪个变体需要最多空间。
20*/
21enum Message {
22    Quit,
23    Move { x: i32, y: i32 },
24    Write(String),
25    ChangeColer(i32, i32, i32),
26}
27
28/// 运行结果为
29/// ```txt
30/// list: Cons(32, Cons(24, Cons(36, Nil)))
31/// ```
32pub fn box_pointer_study() {
33    store_base_type_on_heap();
34    // 不加Box::new()会出现error[E0072]: recursive type `List` has infinite size 编译错误
35    // let list2 = List::Cons(32, List::Cons(18, List::Nil));
36    let list = Box::new(List::Cons(
37        32,
38        Box::new(List::Cons(
39            24,
40            Box::new(List::Cons(36, Box::new(List::Nil))),
41        )),
42    ));
43    println!("list: {:?}", list);
44    // 释放内存的时候,指针和指向指针的数据都会被释放;
45}