使用泛型和Fn trait 的闭包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//实现一个缓存,只处理第一次传入的值并保存
struct Cacher<T>
where T: Fn(u32) -> u32 //这里的Fn trait有一个回调,是这个函数自带的
{
calcuation: T,
value: Option<u32>,
}
impl<T> Cacher<T>
where T: Fn(u32) -> u32
{
fn new(calcuation: T) -> Cacher<T> {
Cacher {
calcuation, //当传入参数和函数体字段重名的时候,可以省略参数类型声明
value: None,
}
}
fn value(&mut self,arg: u32) -> u32 {
match self.value {
Some(v) => v,
None => {
let v = (self.calcuation)(arg); //由于calcuation是一个闭包
self.value = Some(v);
v
},
}
}
}
fn main() {
let mut c = Cacher::new(|x| x+1); //设计回调,使用回调
let v1 = c.value(1);

let v2 = c.value(2); //进行some的调用
println!("value = {}",v2);
println!("value = {}",v1);
}