RustBook——Cacher学习示例+注释
代码
use std::collections::HashMap;
use std::cmp::Eq;
use std::hash::Hash;
/// # 缓存器结构体
///
/// - calculation: 用于计算value的函数
/// - map: 用于存储数据的容器HashMap
///
/// # Examples
/// ```
/// use rust_demo::Cacher;
///
/// let mut cache = Cacher::new(|x: u32| x * x);
///
/// assert_eq!(25, *cache.value(5));
/// assert_eq!(100, *cache.value(10));
/// assert_eq!(25, *cache.value(5));
/// ```
pub struct Cacher<T, K, V>
where
T: Fn(K) -> V,
K: Eq + Hash + Copy,
{
calculation: T,
map: HashMap<K, V>,
}
impl<T, K, V> Cacher<T, K, V>
where
T: Fn(K) -> V,
K: Eq + Hash + Copy,
{
/// # 工厂方法
/// 用于初次创建Cacher
///
/// - calculation: 用于计算value的函数
pub fn new(calculation: T) -> Cacher<T, K, V> {
Cacher {
calculation,
map: HashMap::new(),
}
}
/// # 取值的方法
/// 当map中没有key对应的value时,调用calculation生成value
///
/// - arg: 用于取值的key
pub fn value(&mut self, arg: K) -> &V {
self.map.entry(arg).or_insert((self.calculation)(arg))
}
}
测试
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cache() {
let mut cache = Cacher::new(|x: u32| x * x);
assert_eq!(25, *cache.value(5));
assert_eq!(100, *cache.value(10));
assert_eq!(25, *cache.value(5));
}
}