3 回答

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
DK有一個(gè)很好的解釋,我將舉一個(gè)例子,在該例子中我們?cè)诙褩I戏峙銬ogor Wolf,避免堆分配:
fn main() {
let dog;
let wolf;
let animal: &Barks;
if 1 == 2 {
dog = Dog;
animal = &dog;
} else {
wolf = Wolf;
animal = &wolf;
}
animal.bark();
}
這有點(diǎn)丑陋,但是引用實(shí)現(xiàn)的間接尋址與相同,而Box開銷卻很少。

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
定義自定義枚舉是最有效的方法。這將允許您在堆棧上精確分配所需的空間量,即最大選項(xiàng)的大小,再加上1個(gè)額外的字節(jié)以跟蹤存儲(chǔ)哪個(gè)選項(xiàng)。與使用a Box或trait引用的解決方案不同,它還允許直接訪問而無需間接級(jí)別。
不幸的是,它確實(shí)需要更多樣板:
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我們只使用一個(gè)堆棧分配的變量,其中包含我們自定義枚舉的一個(gè)實(shí)例。
- 3 回答
- 0 關(guān)注
- 602 瀏覽
添加回答
舉報(bào)