阅读关于Box
的Rust文档,它似乎就像普通指针一样工作。
他们给出的一个例子是:
enum List {
Cons(i32, Box<List>),
Nil,
}
use crate::List::{Cons, Nil};
fn main() {
let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));
}
但也可以这样写:
#[derive(Debug)]
enum List<'a> {
Cons(i32, &'a List<'a>),
Nil,
}
use crate::List::{Cons, Nil};
fn main() {
let list = Cons(1, &Cons(2, &Cons(3, &Nil)));
println!("{:?}", list);
}
使用Box
的原因是什么?
它只是为了语法糖吗?
是否存在我们可以/应该只使用Box
而不是指针的情况?
如果Box
像指针一样工作,我应该更喜欢使用Box
而不是指针吗?
为什么使用Box
时不需要生命周期?
使用Box的主要原因是什么?
Box
允许将值移动到堆分配。否则,默认情况下,它将被堆栈分配。
原文来自文档描述:
用于堆分配的指针类型。
只是语法糖吗?
不是,你可以使用原始指针,但Box
受制于rust借用规则。
是否存在我们可以/应该只使用Box而不是指针的情况?
如果你想使用safe在rust代码中,您将在大多数时间使用Box
。
如果Box像指针一样工作,我应该更喜欢使用Box而不是指针吗?
和以前一样,除非有特殊的需要,否则您将使用Box
。
为什么在使用Box时不需要生命周期?
你不需要如果对象是拥有的,如果它是一个&
引用,例如,你有时需要添加一个生命周期注释。例如,如果您需要为动态特性分配一个堆引用:
struct MyStruct<'a> {
data: Box<&'a dyn SomeTrait>
}