編譯器建議我添加一個'靜態生命周期,因為參數類型可能不夠長,但我不認為這是我想要的我正在嘗試實現看起來像這個最小例子的東西:trait Bar<T> {}struct Foo<T> {
data: Vec<Box<Bar<T>>>,}impl<T> Foo<T> {
fn add<U: Bar<T>>(&mut self, x: U) {
self.data.push(Box::new(x));
}}由于Rust默認為(據我所知)pass-by-ownership,我的心理模型認為這應該有效。該add方法獲取對象的所有權,x并且能夠將此對象移動到a中,Box因為它知道完整類型U(而不僅僅是特征Bar<T>)。一旦進入a Box,框內項目的生命周期應該與框的實際生命周期相關聯(例如,當pop()從矢量中刪除時,對象將被銷毀)。然而,很明顯,編譯器不同意(并且我確定比我更了解...),要求我考慮添加一個'static生命周期限定符(E0310)。我99%肯定這不是我想要的,但我不確定我應該做什么。為了澄清我的想法并幫助識別誤解,我的心理模型來自C ++背景,是:Box<T> 本質上是 std::unique_ptr<T>如果沒有任何注釋,則變量按值傳遞,Copy否則傳遞rvalue-reference與參考注釋,&大致const&和&mut大致&默認生命周期是詞法范圍
2 回答

翻過高山走不出你
TA貢獻1875條經驗 獲得超3個贊
讓我考慮添加一個'靜態終身限定符(E0310)。我99%肯定這不是我想要的,但我不確定我應該做什么。
是的。編譯器不需要&'static
引用,它想要U: 'static
。
具有U: 'static
不U
包含生命周期小于的引用的平均值'static
。這是必需的,因為您希望將U
實例放在沒有生命周期的結構中。
trait Bar<T> {}struct Foo<T> { data: Vec<Box<dyn Bar<T>>>,}impl<T> Foo<T> { fn add<U: Bar<T> + 'static>(&mut self, x: U) { self.data.push(Box::new(x)); }}
添加回答
舉報
0/150
提交
取消