这是我遇到的问题的一个非常简化的示例,但是给定一个trait Thing
which implementsOrd
和一个struct Object
which implements Thing
,我有以下结构:
pub struct MyStruct<'a> {
my_things: HashMap<i32, Vec<Box<dyn Thing + 'a>>>
}
impl<'a> MyStruct<'a> {
pub fn new() -> MyStruct<'a> {
MyStruct {
my_things: HashMap::new()
}
}
pub fn add_object(&mut self, key: i32, obj: Object) {
if !self.my_things.contains_key(&key) {
self.my_things.insert(key, Vec::new());
}
let new_thing: Box<dyn Thing> = Box::new(obj);
let things = self.my_things.get_mut(&key).unwrap();
things.push(new_thing);
things.sort();
}
}
它本质上需要一个键和一个Object
,并使用给定的键将对象添加到 a HashMap
of Vec
s 中。我知道这不是执行此操作的最佳方法,但我想保持简单以进行说明。
编译器在调用时抱怨things.sort()
以下错误:
error[E0308]: mismatched types
--> src/main.rs:58:16
|
58 | things.sort();
| ^^^^ lifetime mismatch
|
= note: expected trait `Ord`
found trait `Ord`
note: the lifetime `'a` as defined on the impl at 42:6...
--> src/main.rs:42:6
|
42 | impl<'a> MyStruct<'a> {
| ^^
= note: ...does not necessarily outlive the static lifetime
如果我在此示例中删除所有'a
生命周期,则代码将编译。但对于我的实际用例,我需要允许非静态生命周期。
有人可以解释这里发生了什么吗?sort()
真的需要Vec
包含具有静态生命周期的项目吗?如果是,为什么?
有没有好的解决方法?