2014-03-31 37 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旨在用于任意类型。

相关问题