Rust 迭代器的结果::max的寿命不够长,尽管该项是直接返回的

Rust 迭代器的结果::max的寿命不够长,尽管该项是直接返回的,rust,lifetime,Rust,Lifetime,此代码(): 。。。导致此错误的原因: <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>: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     };

返回
选项
,而不是
选项
,因此max不应该是引用,因此一切都应该是好的…

问题在于,您使用的是返回一个迭代器,该迭代器对向量元素的引用进行迭代。该迭代器的关联类型已经是引用(
Self::Item=&usize
)您的问题有几种解决方案:

  • 取消对结果的引用

    *v.iter().max().unwrap()
    
    v.iter().max().unwrap().clone()
    v.iter().max().cloned().unwrap()
    
    这在这里很好,因为
    v
    的元素是
    Copy
    类型。它不适用于非复制类型

    ⇒ 对你来说很好

  • 克隆结果

    *v.iter().max().unwrap()
    
    v.iter().max().unwrap().clone()
    v.iter().max().cloned().unwrap()
    
    这适用于实现
    克隆的类型。任何实现
    Copy
    的类型也将实现
    Clone
    ,但并非所有实现
    Clone
    的类型都将实现
    Copy

    ⇒ 在使用
    max
    /
    min

  • 使用

    v.iter().cloned().max().unwrap()
    
    效率方面,这仅适用于
    Copy
    类型,因为它克隆迭代器中的每个元素。如果克隆不便宜的话,这将是昂贵的

    ⇒ 通常不适合使用
    min
    /
    max
    ,但在其他情况下使用方便

  • 使用
    Vec::导入

    v.into_iter().max().unwrap()
    
    此方法的问题是,您不能在之后使用
    v

    ⇒ 通常不适合使用
    min
    /
    max
    ,但在其他情况下使用方便


  • 你能解释一下为什么你认为后两个选项“在这种情况下是坏的”吗?例如,我个人会用
    cloned()
    编写成
    。@Vladimitaveveveveve谢谢,这确实是一个令人困惑的公式。我不是说“这个”案子,而是说一般的案子。当然,在我的示例代码中,使用后两个选项并没有什么区别。但是在一般情况下,如果有一个向量并且想要找到最小值/最大值,
    到iter
    克隆的
    可能不是你想要的。