繁体   English   中英

Rust – 从 trait 方法返回 trait 对象时无法推断出适当的生命周期

[英]Rust – cannot infer an appropriate lifetime when returning trait object from trait method

我正在尝试制作类似于不可变 Dictionary 特征的东西,可以将新项目(引用)添加到并使用而不影响以前的版本。 最小的例子:

#[derive(Clone)]
pub struct SetOfValues<'a> {
    value: Vec<&'a i32>,
}

pub trait TheSetAccessor<'b> {
    fn with_additional_values(&self, new_set: Vec<&'b i32>) -> Box<dyn TheSetAccessor<'b>>;
    fn get_from_set(&self, index: usize) -> &i32;
}

impl<'a, 'b : 'a> TheSetAccessor<'b> for SetOfValues<'a> {
    fn with_additional_values(&self, new_set: Vec<&'b i32>) -> Box<dyn TheSetAccessor<'b>> {
        Box::new(SetOfValues { value: new_set } )
    }

    fn get_from_set(&self, index: usize) -> &i32 {
        self.value[index]
    }
}

fn usage() {
    let a = 0;
    let set = SetOfValues {
        value: vec![&a]
    };

    // ...

    let b = 1;
    let extended_set = set.with_additional_values(vec![&a, &b]);

    // ...

    let got_b = extended_set.get_from_set(1);
}

错误消息如下:

error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
  --> src/test.rs:13:18
   |
13 |         Box::new(SetOfValues { value: new_set } )
   |                  ^^^^^^^^^^^
   |
note: first, the lifetime cannot outlive the lifetime `'b` as defined here...
  --> src/test.rs:11:10
   |
11 | impl<'a, 'b : 'a> TheSetAccessor<'b> for SetOfValues<'a> {
   |          ^^
note: ...so that the expression is assignable
  --> src/test.rs:13:39
   |
13 |         Box::new(SetOfValues { value: new_set } )
   |                                       ^^^^^^^
   = note: expected `Vec<&i32>`
              found `Vec<&'b i32>`
   = note: but, the lifetime must be valid for the static lifetime...
note: ...so that the types are compatible
  --> src/test.rs:13:9
   |
13 |         Box::new(SetOfValues { value: new_set } )
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   = note: expected `Box<(dyn TheSetAccessor<'b> + 'static)>`
              found `Box<dyn TheSetAccessor<'b>>`

据我了解,新的 SetOfValues 应该具有传递向量('b)的生命周期,但这部分

首先,生命周期不能超过此处定义的生命周期'b ...

如我所见,表明 SetOfValues 的新实例具有另一个生命周期('静态?),它应该比'b. 我不太明白我怎么能限制这一生。 我该怎么做才能使此代码正常工作?

这是因为dyn Trait实际上是dyn Trait + 'static 因此, dyn TheSetAccessor<'b>实际上是dyn TheSetAccessor<'b> + 'static ,并且不能包含任何非'static生命周期,因此它需要'b: 'static

为了放宽这个限制,给特征添加一个生命周期: dyn TheSetAccessor<'b> + 'b 请注意,这可能不是最佳解决方案,具体取决于您的用例。

fn with_additional_values(&self, new_set: Vec<&'b i32>) -> Box<dyn TheSetAccessor<'b> + 'b>;

游乐场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM