Здравствуйте. Хочу сразу же извиниться, я понимаю что для кого-то ответ на мой вопрос покажется очевидным. Но я не могу понять, как мне избежать многократного использования кода в функции “value”? Я пытаюсь использовать замыкания, но ничего из этого не выходит, так как владение “self” передаётся в замыкание и “match” выдаёт ошибку.
struct Cacher<T,U>
where T: Fn(U) -> U
{
calculation: T,
argument: Option<U>,
value: Option<U>,
}
impl<T,U> Cacher<T,U>
where T: Fn(U) -> U, U: Copy + PartialEq
{
fn new(calculation: T) -> Cacher<T,U> {
Cacher {
calculation,
argument: None,
value: None,
}
}
fn value(&mut self, arg: U) -> U {
/*let mut f = |a: U| -> U {
let v = (self.calculation)(a);
self.argument = Some(a);
self.value = Some(v);
v
};*/
match self.value {
Some(v) => {
if self.argument.unwrap() == arg { v }
else {
let v = (self.calculation)(arg);
self.argument = Some(arg);
self.value = Some(v);
v
//f(arg)
}
},
None => {
let v = (self.calculation)(arg);
self.argument = Some(arg);
self.value = Some(v);
v
},
}
}
}