這裏例如讀/寫:HashMap的:借在同一時間的什麼,我想實現
use std::collections::HashMap;
fn f(a: &i32, b: &mut i32) {
}
fn main() {
let mut map = HashMap::new();
map.insert("1", 1);
map.insert("2", 2);
{
let a: &i32 = map.get("1").unwrap();
println!("a: {}", a);
let b: &mut i32 = map.get_mut("2").unwrap();
println!("b: {}", b);
*b = 5;
}
println!("Results: {:?}", map)
}
所以我有f
接受兩個引用mut
而不是mut
。 並且在HashMap
內部具有值f
。顯然這是行不通的,因爲HashMap::get
和HashMap::get_mut
借用可變而且不能同時變化。
注意:在真正的代碼,我使用複雜的大結構,而不是i32
,所以不好克隆。
但事實上,我借可變/不可變的兩個不同的東西,像 :
struct HashMap {
a: i32,
b, i32,
}
let mut map = HashMap { a: 1, b: 2 };
let a = &map.a;
let b = &mut map.b;
任何方式指向編譯器,其實這是安全的代碼?
我怎麼看它有可能在這個具體的例子 解決與iter_mut
:
{
let mut a: &i32 = unsafe { mem::uninitialized() };
let mut b: &mut i32 = unsafe { mem::uninitialized() };
for (k, mut v) in &mut map {
match *k {
"1" => {a = v; }
"2" => { b = v; }
_ => {}
}
}
f(a, b);
}
但它與HashMap::get/get_mut
但是'iter_mut'工作,沒有運行時檢查,如果我可以通過'IterMut'跳轉到特定的鍵,那麼可以使用'HashMap'而無需通過'RefCell'進行運行時檢查。 – user1244932
@ user1244932:'IterMut'保證它只產生一次單個引用,按照它的語義:你永遠不能通過'IterMut'返回已經產生的元素,這樣得到的元素藉用原始映射(因此也不能產生另一個元素)。 –