Rust 将一个"impl Trait"移动到一个拥有的 "Box<dyn Trait>"中,而不添加生命周期绑定



这里,编译器抱怨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) {
|                                       +++++++++

在我的例子中,itemVecWrapper是在运行时创建的,用于错误处理,所以我希望在这里避免使用生命周期。

你的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));
}

最新更新