2015-05-01 33 views
2

我想創建一個函數,該函數獲取與哈希表中的鍵相關的值,如果此值不存在,則插入任意值(讓我們說0)。混合對HashMap的可變引用和不可變引用

use std::collections::HashMap; 

fn get_or_insert(table: &mut HashMap<i32, i32>, key: i32) -> i32 { 
    match table.get(&key) { 
     None => table.insert(key, 0).unwrap(), 
     Some(v) => *v, 
    } 
} 

此代碼不編譯:

error[E0502]: cannot borrow `*table` as mutable because it is also borrowed as immutable 
--> src/main.rs:5:17 
    | 
4 |  match table.get(&key) { 
    |   ----- immutable borrow occurs here 
5 |   None => table.insert(key, 0).unwrap(), 
    |     ^^^^^ mutable borrow occurs here 
6 |   Some(v) => *v, 
7 |  } 
    |  - immutable borrow ends here 

實際上,table被性情不定地在該方法中insert而它在該方法get一成不變藉藉來的。

我看不出在這個函數中分隔可變和不可變部分的辦法。

回答

2

這是一個偉大的時間使用entry方法:

use std::collections::HashMap; 

fn get_or_insert(table: &mut HashMap<i32, i32>, key: i32) -> i32 { 
    *table.entry(key).or_insert(0) 
} 

fn main() {} 

但你是正確的,否則你不得不拆分電話:

fn get_or_insert(table: &mut HashMap<i32, i32>, key: i32) -> i32 { 
    match table.get(&key) { 
     None => {} 
     Some(v) => return *v, 
    } 

    table.insert(key, 0).unwrap() 
} 

但是,你算算哈希第二次,這是entry創建的原因的一部分。

作爲便箋,insert返回以前的值作爲密鑰。如果我正確閱讀,您的電話將始終失敗。

+0

謝謝,我不知道有'return'關鍵字。這很有用! – user19018

相關問題