此代码(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不应该是引用,因此一切都应该没问题。 ..
答案 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
v.iter().cloned().max().unwrap()
效率方面,这只适用于Copy
类型,因为它克隆了迭代器中的每个元素。如果克隆不便宜,这将是昂贵的。
⇒一般不使用min
/ max
,但在其他情况下使用方便
使用Vec::into_iter
v.into_iter().max().unwrap()
此方法的问题在于您之后无法使用v
。
⇒一般不使用min
/ max
,但在其他情况下使用方便