у меня есть простое HashMap
; скажем HashMap<char, char>
.
есть ли способ поменять два элемента в этой хэш-карте, используя std::mem::swap
(или любой другой метод)?
Конечно, есть простой способ получить значения с помощью get
и затем заменить их на insert
- но это дважды вызовет хэш (один раз для получения, а затем для вставки), и я искал способ обойти второй вызов хэша (скорее из любопытства, чем из-за производительности).
я попробовал вот что (в нескольких версиях, ни одна из которых не работала - и, как отмечено в комментариях: entry
не будет делать то, что я ожидаю, даже если я получу это мимо компилятора):
use std::collections::HashMap;
use std::mem::swap;
let mut hash_map: HashMap<char, char> = HashMap::default();
hash_map.insert('A', 'Z');
hash_map.insert('B', 'Y');
swap(&mut hash_map.entry('A'), &mut hash_map.entry('B'));
теперь компилятор жалуется (я понимаю, почему это должно)
error[E0499]: cannot borrow `hash_map` as mutable more than once at a time
--> tests.rs:103:42
|
103 | swap(&mut hash_map.entry('A'), &mut hash_map.entry('B'));
| ---- -------- ^^^^^^^^ second mutable borrow occurs here
| | |
| | first mutable borrow occurs here
| first borrow later used by call
также просто получая эти два значения терпят неудачу более или менее одинаково:
let mut a_val = hash_map.get_mut(&'A').expect("failed to get A value");
let mut b_val = hash_map.get_mut(&'B').expect("failed to get B value");
swap(&mut a_val, &mut b_val);
есть ли способ просто поменять две записи в HashMap
?