锈盒vs指针

  • 本文关键字:指针 vs 锈盒 rust
  • 更新时间 :
  • 英文 :


阅读关于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>
}

最新更新