これは、私が直面している問題の非常に単純化された例ですが、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
して オブジェクトを の に追加します。これが最適な方法ではないことはわかっていますが、説明のために簡単にしたかったのです。HashMap
Vec
コンパイラは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
もしそうなら、なぜですか?
良い回避策はありますか?