返回对具有通用Fn特征/值的泛型类型的引用

时间:2017-09-02 16:36:27

标签: rust closures lifetime borrow-checker ownership-semantics

我刚开始学习Rust并正在学习Rust书。其中一章引出了一些例子,最后以#34;试图使这个通用"建议的练习类型。我一直在全力以赴。您开始使用的半泛型类型是:

struct Cacher<T>
    where T: Fn(i32) -> i32
{
    value: Option<i32>,
    // leaving out rest for brevity

然后我开始转换它,以便Fn特性也是通用的,这也直接影响&#34;值。&#34;所以这就是我提出的:

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值getter中。我不确定我是否关闭或者我只是走错了路。那么我要从哪里走出去?

1 个答案:

答案 0 :(得分:1)

  

并且展开似乎不起作用......

问题是unwrap按值获取它的参数,因此它会被移动。

self.value.as_ref().unwrap()之类的东西可以解决问题。