mirror of https://github.com/sunface/rust-course
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.
51 lines
874 B
51 lines
874 B
3 years ago
|
## 闭包
|
||
|
|
||
|
下面代码是Rust圣经课程中[闭包](http://course.rs/advance/functional-programing/closure.html#结构体中的闭包)章节的课内练习题答案:
|
||
|
|
||
|
```rust
|
||
|
struct Cacher<T,E>
|
||
|
where
|
||
|
T: Fn(E) -> E,
|
||
|
E: Copy
|
||
|
{
|
||
|
query: T,
|
||
|
value: Option<E>,
|
||
|
}
|
||
|
|
||
|
impl<T,E> Cacher<T,E>
|
||
|
where
|
||
|
T: Fn(E) -> E,
|
||
|
E: Copy
|
||
|
{
|
||
|
fn new(query: T) -> Cacher<T,E> {
|
||
|
Cacher {
|
||
|
query,
|
||
|
value: None,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn value(&mut self, arg: E) -> E {
|
||
|
match self.value {
|
||
|
Some(v) => v,
|
||
|
None => {
|
||
|
let v = (self.query)(arg);
|
||
|
self.value = Some(v);
|
||
|
v
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
fn main() {
|
||
|
|
||
|
}
|
||
|
|
||
|
#[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, 1);
|
||
|
}
|
||
|
```
|