Возврат ссылки на универсальный тип с характерной чертой / значением Fn
Я только начинаю изучать Rust и прорабатываю книгу Rust. Одна из глав содержит несколько примеров и заканчивается предложенным упражнением типа "попробуй сделать этот универсальный". Я полностью ударился об этом. Полуобщий тип, с которого вы начинаете, таков:
struct Cacher<T>
where T: Fn(i32) -> i32
{
value: Option<i32>,
// leaving out rest for brevity
Затем я приступаю к преобразованию этого, так что черта Fn также является общей, что также напрямую влияет на "ценность". Итак, вот что я придумал:
struct Cacher<T, U>
where T: Fn(U) -> U
{
calculation: T,
value: Option<U>,
}
impl<T, U> Cacher<T, U>
where T: Fn(U) -> U
{
fn new(calculation: T) -> Cacher<T, U> {
Cacher {
calculation,
value: Option::None,
}
}
fn value(&mut self, arg: U) -> &U {
match self.value {
Some(ref v) => v,
None => {
let v = (self.calculation)(arg);
self.value = Some(v);
// problem is returning reference to value that was in
// v which is now moved, and unwrap doesn't seem to work...
},
}
}
}
Все мои проблемы находятся в получателе значения fn. Я не уверен, что я рядом или просто пошел по совершенно неправильному пути. Так куда я схожу с рельсов?
1 ответ
и разворачивание не похоже на работу...
Проблема в том, что unwrap
принимает его аргумент по значению, поэтому он становится перемещенным.
Что-то вроде self.value.as_ref().unwrap()
должен сделать свое дело.