2个版本
| 0.1.1 | 2019年8月23日 | 
|---|---|
| 0.1.0 | 2019年8月23日 | 
#274 in 缓存
11KB
184 行
red_memo是一个简单、安全、单线程、纯Rust的记忆化和动态规划库。
Memoizer<K,V>是主要的缓存类型。它可以初始化为底层的std::collections::HashMap使用new_hash(),或者使用底层的std::collections::BTreeMap使用new_ord()。
键可以是有序的或哈希的。外部API在这两种情况下都是相同的,
为了使错误消息清晰易懂,需要Debug trait用于键和值。
为了满足用户对记忆化缓存的需求,需要Clone trait用于键。
需要Clone trait用于值。如果Memoizer返回对缓存值的不可变引用,就像通常那样,那么在从旧值计算新值时,缓存将不得不不可变借用,并且缓存不会更新新值。
如果值类型无法实现Clone,或者复制成本过高,请考虑使用std::rc::Rc。
use red_memo::Memoizer;
fn fibonacci(mem: &mut Memoizer<usize, usize>, k: &usize) -> usize
{
    let k = *k;
    if k < 2 {
        k
    } else {
        mem.lookup(&(k - 1)) + mem.lookup(&(k - 2))
    }
}
fn main()
{
    let mut fib_cache = Memoizer::new_ord(fibonacci);
    // since usize implements Hash+Eq as well, this could instead be
    // let mut fib_cache = Memoizer::new_hash(fibonacci);
    println!("fibonacci(20) = {}", fib_cache.lookup(&20));
    assert_eq!(fib_cache.lookup(&40), 102334155);
}