mirror of https://github.com/KaiserY/trpl-zh-cn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
799 B
48 lines
799 B
3 years ago
|
struct Cacher<T>
|
||
|
where
|
||
|
T: Fn(u32) -> u32,
|
||
|
{
|
||
|
calculation: T,
|
||
|
value: Option<u32>,
|
||
|
}
|
||
|
|
||
|
impl<T> Cacher<T>
|
||
|
where
|
||
|
T: Fn(u32) -> u32,
|
||
|
{
|
||
|
fn new(calculation: T) -> Cacher<T> {
|
||
|
Cacher {
|
||
|
calculation,
|
||
|
value: None,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn value(&mut self, arg: u32) -> u32 {
|
||
|
match self.value {
|
||
|
Some(v) => v,
|
||
|
None => {
|
||
|
let v = (self.calculation)(arg);
|
||
|
self.value = Some(v);
|
||
|
v
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[cfg(test)]
|
||
|
mod tests {
|
||
|
use super::*;
|
||
|
|
||
|
// ANCHOR: here
|
||
|
#[test]
|
||
|
fn call_with_different_values() {
|
||
|
let mut c = Cacher::new(|a| a);
|
||
|
|
||
|
let v1 = c.value(1);
|
||
|
let v2 = c.value(2);
|
||
|
|
||
|
assert_eq!(v2, 2);
|
||
|
}
|
||
|
// ANCHOR_END: here
|
||
|
}
|