gpt4 book ai didi

rust - Iterator::max 的结果虽然直接返回项目,但生命周期不够长

转载 作者:行者123 更新时间:2023-11-29 08:16:42 27 4
gpt4 key购买 nike

这段代码(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 不应该是一个引用,因此一切都应该没问题......

最佳答案

问题是您正在使用 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,但在其他情况下很方便

关于rust - Iterator::max 的结果虽然直接返回项目,但生命周期不够长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37407663/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com