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}