3 回答
TA贡献1809条经验 获得超8个赞
DK有一个很好的解释,我将举一个例子,在该例子中我们在堆栈上分配Dogor Wolf,避免堆分配:
fn main() {
let dog;
let wolf;
let animal: &Barks;
if 1 == 2 {
dog = Dog;
animal = &dog;
} else {
wolf = Wolf;
animal = &wolf;
}
animal.bark();
}
这有点丑陋,但是引用实现的间接寻址与相同,而Box开销却很少。
TA贡献1995条经验 获得超2个赞
定义自定义枚举是最有效的方法。这将允许您在堆栈上精确分配所需的空间量,即最大选项的大小,再加上1个额外的字节以跟踪存储哪个选项。与使用a Box或trait引用的解决方案不同,它还允许直接访问而无需间接级别。
不幸的是,它确实需要更多样板:
enum WolfOrDog {
IsDog(Dog),
IsWolf(Wolf)
}
use WolfOrDog::*;
impl Barks for WolfOrDog {
fn bark(&self) {
match *self {
IsDog(ref d) => d.bark(),
IsWolf(ref w) => w.bark()
}
}
}
fn main() {
let animal: WolfOrDog;
if 1 == 2 {
animal = IsDog(Dog);
} else {
animal = IsWolf(Wolf);
}
animal.bark();
}
在这里,main我们只使用一个堆栈分配的变量,其中包含我们自定义枚举的一个实例。
- 3 回答
- 0 关注
- 566 浏览
添加回答
举报