虽然直接返回了项目,但Iterator :: max的结果不够长

时间:2016-05-24 08:03:15

标签: rust lifetime

此代码(Playground):

let max = {
    let mut v = vec![3, 1, 5, 1, 5, 9, 2, 6];
    v.iter().max().unwrap()
};
println!("{}", max);

...导致此错误:

<anon>:4:9: 4:10 error: `v` does not live long enough
<anon>:4         v.iter().max().unwrap()
                 ^
<anon>:5:7: 7:2 note: reference must be valid for the block suffix following statement 0 at 5:6...
<anon>:5     };
<anon>:6     println!("{}", max);
<anon>:7 }
<anon>:3:50: 5:6 note: ...but borrowed value is only valid for the block suffix following statement 0 at 3:49
<anon>:3         let mut v = vec![3, 1, 5, 1, 5, 9, 2, 6];
<anon>:4         v.iter().max().unwrap()
<anon>:5     };

我不理解这个错误:Iterator::max返回Option<Self::Item>,而不是Option<&Self::Item>,因此max不应该是引用,因此一切都应该没问题。 ..

1 个答案:

答案 0 :(得分:2)

问题是你正在使用Vec::iter返回一个迭代器,它迭代引用到向量的元素。该迭代器的关联类型已经是引用(Self::Item = &usize)您的问题有一些解决方案:

  • 取消引用结果

    *v.iter().max().unwrap()
    

    这在这里工作正常,因为v的元素是Copy类型。它不适用于非Copy类型!

    在你的情况下很好

  • 克隆结果

    v.iter().max().unwrap().clone()
    v.iter().max().cloned().unwrap()
    

    这适用于实现Clone的类型。任何实现Copy的类型也会实现Clone,但实现Clone的所有类型都不会实现Copy

    在使用max / min

  • 的一般情况下表现良好
  • 使用Iterator::cloned

    v.iter().cloned().max().unwrap()
    

    效率方面,这只适用于Copy类型,因为它克隆了迭代器中的每个元素。如果克隆不便宜,这将是昂贵的。

    一般不使用min / max,但在其他情况下使用方便

  • 使用Vec::into_iter

    v.into_iter().max().unwrap()
    

    此方法的问题在于您之后无法使用v

    一般不使用min / max,但在其他情况下使用方便