簡體   English   中英

如何將接口 function 消耗自身的動態特征裝箱?

[英]How to box a dyn trait with interface function consume itself?

來自https://doc.rust-lang.org/rust-by-example/trait/dyn.html ,眾所周知,編譯時不知道 dyn trait 的大小,因此我們不能將其用作返回值。 但是什么時候可以創建一個引用並將其放入盒子中,盒子的大小是固定的。

但是我遇到了一個問題,我怎樣才能裝箱一個有接口的 tait 來消費它。

#[tokio::test]
async fn test_dyn_trait() {
    trait Consume {
        fn usage(self) -> String;
    }
    trait Refer {
        fn usage(&self) -> String;
    }

    struct Man {
        name: String,
    }
    impl Consume for Man {
        fn usage(self) -> String {
            let Man { name } = self;
            return name;
        }
    }
    impl Refer for Man {
        fn usage(&self) -> String {
            return self.name.clone();
        }
    }

    let a: Box<dyn Consume> = Box::new(Man {
        name: "aaron".to_string(),
    });
    let b: Box<dyn Refer> = Box::new(Man {
        name: "aaron".to_string(),
    });
    println!("a: {}", a.usage()); // cannot move a value of type dyn Consume: the size of dyn Consume cannot be statically determined
    println!("b: {}", b.usage()); // it is ok
}

這是不可能的。 Rust 有一個叫做object safety的東西,它可以防止創建特征的特征對象,這些特征的方法要么接受或返回Self (並耦合其他東西)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM