我正在尝试实现类似于这个最小化示例的东西:
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默认(据我所知)按所有权传递,我的心理模型认为这应该起作用。 add
方法获取对象x
的所有权,并能将此对象移动到Box
中,因为它了解完整的类型U
(而不仅仅是trait Bar<T>
)。 移动到Box
中后,盒子内部项的生命周期应与盒子的实际生命周期绑定(例如从向量中pop()
时,对象将被销毁)。
但是,编译器显然不同意(我相信它比我知道更多...),要求我考虑添加'static
生命周期限定符(E0310)。 我确信99%那不是我想要的,但我不确定我应该做什么。
为澄清我的想法并帮助识别误解,来自C ++背景的我的心理模型是:
Box<T>
本质上是std :: unique_ptr<T>
- 如果
Copy
,则变量按值传递,否则按rvalue-reference传递 - 具有引用注释的话,
&
大致相当于const&
,而&mut
大致相当于&
- 默认生命周期是词法范围