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
和克隆的可能不是你想要的。