3

これは、私が直面している問題の非常に単純化された例ですが、trait Thingwhich implementsOrdstruct Objectwhich 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して オブジェクトを の に追加します。これが最適な方法ではないことはわかっていますが、説明のために簡単にしたかったのです。HashMapVec

コンパイラは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もしそうなら、なぜですか?

良い回避策はありますか?

4

1 に答える 1