Rustでmut selfとか書いてしまってついつい変数が移動する

こういうキャッシュを実装していて

#[derive(Debug, Clone)]
struct Cache {
    items_data: HashMap<String, Vec<Item>>,
}

impl Cache {
    fn set_items(mut self, name: String, data: Vec<Item>) {
        self.items_data.insert(name, data);
    }
}

これをArc<futures::lock::Mutex<Cache>>型でもっているときに、使うときにロックを取得してエラーが出た。

let mut hoge = cache.lock().await;
hoge.set_items(name, data.clone());
error[E0507]: cannot move out of dereference of `futures_util::lock::mutex::MutexGuard<'_, server::Cache>`
   --> src/server.rs:173:9
    |
173 |         hoge.set_items(name, data.clone());
    |         ^^^^ move occurs because value has type `server::Cache`, which does not implement the `Copy` trait

これはロックとは関係なくてset_itemsが参照ではない要求をしていたからで、参照でも別にいいので下記のように書き換えればコンパイルが通る。

#[derive(Debug, Clone)]
struct Cache {
    items_data: HashMap<String, Vec<Item>>,
}

impl Cache {
    fn set_items(&mut self, name: String, data: Vec<Item>) {
        self.items_data.insert(name, data);
    }
}

なんでこんなことを書いたかというと、これと同じことで詰まったことがもう5回くらいあって(Mutexを絡めたコード書いてると複雑だから混乱しちゃって詰まる)、日本語で検索しても情報はないので、日本語で書いて自分で引っかかろうと思って。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA