这里,编译器抱怨impl Foo
可能存在的时间不够长:
struct VecWrapper(Vec<Box<dyn Foo>>);
impl VecWrapper {
fn push(&mut self, item: impl Foo) {
self.0.push(Box::new(item))
}
}
trait Foo {}
这不是我所期望的,因为item
应该移动到Box
中。编译器建议添加静态生存期:
|
4 | fn push(&mut self, item: impl Foo + 'static) {
| +++++++++
在我的例子中,item
和VecWrapper
是在运行时创建的,用于错误处理,所以我希望在这里避免使用生命周期。
你的trait可以通过像struct Bar<'a, T>(&'a T);
这样的东西来实现,如果你将这种类型的值传递给你的函数,你的结构将不能充分反映&'a T
强加的'a
的生命周期。
如果你不想把VecWrapper
限制为自己拥有的类型,你可以给VecWrapper
添加一个生存期,并把它放在impl Foo
上。将'static
绑定到impl Foo
,将限制VecWrapper
为自己的类型。
struct VecWrapper<'a>(Vec<Box<dyn Foo + 'a>>);
impl<'a> VecWrapper<'a> {
fn push(&mut self, item: impl Foo + 'a) {
self.0.push(Box::new(item))
}
}
trait Foo {}
struct Bar<'a, T>(&'a T);
impl<'a, T> Foo for Bar<'a, T> {
}
fn foo() {
let s = String::new();
VecWrapper(vec![]).push(Bar(&s));
}