Вот эмуляция моей проблемы, когда заимствование заканчивается слишком поздно
use std::collections::HashMap;
struct Item {
capacity: u64
}
struct Petrol {
name: String,
fuel: HashMap<&'static str, Item>
}
fn buy_gaz(p: &mut Petrol) {
match p.fuel.get("gaz") {
Some(gaz) => {
fire_petrol(p);
}
None => ()
}
}
fn fire_petrol(p: &mut Petrol) {
println!("Boom!");
p.fuel.remove("gaz");
p.fuel.remove("benzin");
}
fn main() {
let mut bt = Petrol {
name: "Britii Petrovich".to_string(),
fuel: HashMap::new()
};
bt.fuel.insert("gaz", Item { capacity: 1000 });
bt.fuel.insert("benzin", Item { capacity: 5000 });
buy_gaz(&mut bt);
}
При компиляции получаю:
note: previous borrow of `p.fuel` occurs here; the immutable borrow prevents subsequent moves or mutable borrows of `p.fuel` until the borrow ends
match p.fuel.get("gaz") {
^~~~~~
Почему заимствование заканчивается так поздно, а не при выходе из HashMap::get
? Как исправить мой случай?
PS: я отредактировал свой первый пост для добавления структуры в HashMap
, потому что приведенное ниже решение работало для простых типов (я думаю, с чертой Clone по умолчанию), но не работает для пользовательских структур
#[derive(Copy)]
перед определением структуры: is.gd/nrBnMk 10.04.2015remove
вместоget
, что удаляет значение с карты и возвращает его 10.04.2015remove
, я меняюHashMap
, и я просто хочу получить значение и ничего более. И это значение я не могу скопировать. Только такие решения существуют? 10.04.2015&mut self
. Скорее всего, вы сможете обойти свою проблему. но посколькуfire_petrol
не используетgaz
, вы можете просто вызватьfire_petrol
после совпадения и вместо этого ветвьNone=>()
будетNone=>return
10.04.2015