亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否允許多態變量?

是否允許多態變量?

Git
慕慕森 2019-10-21 15:44:45
我有各種結構都實現相同的特征。我想在某種條件下分支,在運行時確定要實例化哪些結構。然后,無論我跟隨哪個分支,我都希望從該特征調用方法。在Rust中這可能嗎?我希望實現類似以下的內容(無法編譯):trait Barks {    fn bark(&self);}struct Dog;impl Barks for Dog {    fn bark(&self) {        println!("Yip.");    }}struct Wolf;impl Barks for Wolf {    fn bark(&self) {        println!("WOOF!");    }}fn main() {    let animal: Barks;    if 1 == 2 {        animal = Dog;    } else {        animal = Wolf;    }    animal.bark();}
查看完整描述

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開銷卻很少。


查看完整回答
反對 回復 2019-10-21
?
拉風的咖菲貓

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我們只使用一個堆棧分配的變量,其中包含我們自定義枚舉的一個實例。


查看完整回答
反對 回復 2019-10-21
  • 3 回答
  • 0 關注
  • 605 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號