[英]Rust – cannot infer an appropriate lifetime when returning trait object from trait method
I'm trying to make something like immutable Dictionary trait that can be added new items (references) into and used without affecting the previous version.我正在尝试制作类似于不可变 Dictionary 特征的东西,可以将新项目(引用)添加到并使用而不影响以前的版本。 Minimal example:
最小的例子:
#[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);
}
The error message is following:错误消息如下:
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>>`
As far as I understand, the new SetOfValues should have the lifetime of the passed vector ('b), but this part据我了解,新的 SetOfValues 应该具有传递向量('b)的生命周期,但这部分
first, the lifetime cannot outlive the lifetime
'b
as defined here...首先,生命周期不能超过此处定义的生命周期
'b
...
as I see, suggests that the new instance of SetOfValues has another lifetime ('static ?) that is supposed to live longer than 'b.如我所见,表明 SetOfValues 的新实例具有另一个生命周期('静态?),它应该比'b. I don't quite understand how I can restrict this lifetime.
我不太明白我怎么能限制这一生。 What can I do to make this code work?
我该怎么做才能使此代码正常工作?
This is because dyn Trait
is actually dyn Trait + 'static
.这是因为
dyn Trait
实际上是dyn Trait + 'static
。 Thus, dyn TheSetAccessor<'b>
is actually dyn TheSetAccessor<'b> + 'static
, and cannot contain any non- 'static
lifetime, so it requires 'b: 'static
.因此,
dyn TheSetAccessor<'b>
实际上是dyn TheSetAccessor<'b> + 'static
,并且不能包含任何非'static
生命周期,因此它需要'b: 'static
。
To relax this bound add a lifetime to the trait: dyn TheSetAccessor<'b> + 'b
.为了放宽这个限制,给特征添加一个生命周期:
dyn TheSetAccessor<'b> + 'b
。 Note this may not be the best solution, depending on your use case.请注意,这可能不是最佳解决方案,具体取决于您的用例。
fn with_additional_values(&self, new_set: Vec<&'b i32>) -> Box<dyn TheSetAccessor<'b> + 'b>;
Playground . 游乐场。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.