2014-03-31 61 views
4

我想記住一個遞歸的collat​​z序列函數生鏽,但是我需要memoized值的hashmap來保持其內容跨單獨的函數調用。有沒有一種優雅的方式來防止這種情況發生,或者我必須在main中聲明hashmap並每次將它傳遞給函數?我相信每次我調用函數時,hashmap都會被重新聲明爲空映射。這裏是我的代碼:保持一個變量生存在多個函數調用中生鏽

fn collatz(n: int) -> int { 
    let mut map = HashMap::<int, int>::new(); 
    if map.contains_key(&n) {return *map.get(&n);} 
    if n == 1 { return 0; } 
    map.insert(n, 
     match n % 2 { 
      0 => { 1 + collatz(n/2) } 
      _ => { 1 + collatz(n*3+1) } 
     } 
    ); 
    return *map.get(&n); 
} 

在一個側面說明,爲什麼我需要添加所有的&的年代和*的時候,我插拔項目從HashMap中的?我只是這樣做,因爲編譯器抱怨,並加入他們修復它,但我不知道爲什麼。我能不能通過價值傳遞?謝謝。

回答

3

您可以使用thread_local進行線程局部靜態。

thread_local! (static COLLATZ_MEM: HashMap<i32, i32> = HashMap::new()); 
fn collatz(n: i32) -> i32 { 
    COLLATZ_MEM.with (|collatz_mem| { 
     0 // Your code here. 
    }) 
} 

P.S.還有一個出色的lazy-static宏,可用於真正的全局靜態緩存。 Here就是一個例子。

+0

到local_data的鏈接被破壞 – Gevious

3

在Rust中沒有「靜態」的本地人,在C中沒有。也許創建一個對象,把它放在裏面,並使其成爲一種方法。

您無法通過值傳遞,因爲它會執行副本(對於複雜鍵可能會很昂貴)或移動(這會使您無法再次使用該鍵)。在這種情況下,您的密鑰只是整數,但API旨在用於任意類型。

相關問題