Возврат ссылки на универсальный тип с характерной чертой / значением 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() должен сделать свое дело.

Другие вопросы по тегам