rust 当实现`TraitFoo`结构体包含引用时,如何从方法返回`Box〈dyn TraitFoo>`?

dw1jzc5e  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(105)

如果我有一个结构体Bar,它包含对X的引用,我可以在Bar上实现一个方法fun,它返回另一个包含相同引用的结构体Foo

struct X{}

trait TraitFoo{}
struct FooImpl<'a> {
    pub reference: &'a X
}
impl<'a> TraitFoo for FooImpl<'a> {}

struct Bar<'a> {
    pub reference: &'a X
}
impl<'a> Bar<'a> {
    fn fun(&self) -> Box<FooImpl> {
        Box::new(FooImpl{ reference: self.reference })
    }
}

但是,当我尝试将fun改为返回trait时,如下所示:

impl<'a> Bar<'a> {
    fn fun(&self) -> Box<dyn TraitFoo> {
        Box::new(FooImpl{ reference: self.reference })
    }
}

我得到一个编译错误:

error: lifetime may not live long enough
  --> src/main.rs:14:9
   |
12 | impl<'a> Bar<'a> {
   |      -- lifetime `'a` defined here
13 |     fn fun(&self) -> Box<dyn TraitFoo> {
14 |         Box::new(FooImpl{ reference: self.reference })
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static`

为什么不允许这样做?有没有其他方法可以达到这种效果?

cwdobuhd

cwdobuhd1#

你需要告诉Rust盒子中的值的生命周期与Bar中的生命周期绑定:

impl<'a> Bar<'a> {
    fn fun(&self) -> Box<dyn TraitFoo + 'a> {
        Box::new(FooImpl { reference: self.reference })
    }
}

playground

相关问题