📅  最后修改于: 2021-01-08 13:57:28             🧑  作者: Mango
Box
fn main()
{
let a = Box :: new(1);
print!("value of a is : {}",a);
}
输出:
value of a is : 1
在上面的示例中,a包含指向数据1的Box值。如果我们访问Box的值,则程序将输出“ 1”。程序结束时,将重新分配Box。该框存储在堆栈上,它指向的数据存储在堆上。
让我们看一下上面例子的图示:
现在,我们创建包含cons列表的枚举。
enum List
{
cons(i32, List),
Nil,
}
在上面的代码中,我们创建List类型的枚举,其中包含i32值的cons列表数据结构。
现在,在以下示例中使用上面的列表类型:
enum List {
Cons(i32, List),
Nil,
}
use List::{Cons, Nil};
fn main()
{
let list = List::Cons(1,Cons(2,Cons(3,Nil)));
for i in list.iter()
{
print!("{}",i);
}
}
输出:
在上面的示例中,Rust编译器抛出错误“具有无限大小”,因为List类型包含递归变量。结果,Rust无法找到存储List值需要多少空间。通过使用Box
Rust无法弄清楚存储递归数据类型需要多少空间。 Rust编译器在前一种情况下显示错误:
= help: insert indirection (e.g., a 'Box', 'Rc', or '&') at some point to make 'List' representable
在上述情况下,我们可以使用Box
让我们看一个简单的例子:
#[derive(Debug)]
enum List {
Cons(i32, Box),
Nil,
}
use List::{Cons, Nil};
fn main()
{
let list = Cons(1,Box::new(Cons(2,Box::new(Cons(3,Box::new(Nil))))));
print!("{:?}",list);
}
输出:
Cons(1, Cons(2, Cons(3, Nil)))
注意:如果我们使用Box