编译器建议我添加一个'静态生命周期,因为参数类型可能不够长,但我不认为这是我想要的
我正在尝试实现看起来像这个最小例子的东西:
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
大致&
默认生命周期是词法范围
翻过高山走不出你