ИЗМЕНИТЬ Поскольку предыдущий ответ просто неверен и вообще не отвечает на вопрос, есть код, который не показывает никаких предупреждений ( игровая площадка )
Теперь это хэш-карта со значениями Rc<_>
, а val_rc
содержит только счетчик ссылок на фактические данные (в данном случае номер 1
). Поскольку это всего лишь счетчик, его клонирование бесплатно. Однако обратите внимание, что существует только одна копия числа, поэтому, если вы измените значение some_map["a"]
, то some_map["b"]
также изменится, поскольку они относятся к одной части памяти. Также обратите внимание, что 1
живет в стеке, поэтому вам лучше подумать о том, чтобы превратить его в Rc<Box<_>>
, если вы планируете добавить много тяжелых объектов.
use std::collections::HashMap;
use std::rc::Rc;
fn main() {
let mut some_map = HashMap::new();
some_map.insert("a", Rc::new(1));
let val_rc = Rc::clone(some_map.get("a").unwrap());
if *val_rc != 2 {
some_map.insert("b", val_rc);
}
}
Предыдущая версия ответа
Трудно сказать, что именно вы ищете, но в этом конкретном случае, если вам нужно только проверить значение, уничтожьте заимствованное значение, прежде чем обновлять хэш-карту. Грязный и уродливый код будет таким:
fn main() {
let mut some_map = HashMap::new();
some_map.insert("a", 1);
let is_ok = false;
{
let some_val = some_map.get("a").unwrap();
is_ok = *some_val != 2;
}
if is_ok {
some_map.insert("b", *some_val);
}
}