[英]How do I convert the “largest value in a Vec” example in the Rust book to not use the Copy trait?
我正在尝试完成2018年Rust书中的 “留给读者”的练习。 他们有10-15的示例使用了Copy
特征。 但是,他们建议在没有Copy
的情况下实现相同的功能,而我一直在为此苦苦挣扎。
没有Copy
,我不能使用largest = list[0]
。 编译器建议改为使用参考。 我这样做是将largest
的&T
。 然后,编译器抱怨比较中使用的largest
的是&T
,而不是T
,因此我将其更改为*largest
以取消引用指针。 这很好,但随后偶然发现了largest = item
,抱怨T
而不是&T
。 我切换到largest = &item
。 然后我得到一个我无法处理的错误:
error[E0597]: `item` does not live long enough
--> src/main.rs:6:24
|
6 | largest = &item;
| ^^^^ borrowed value does not live long enough
7 | }
8 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the anonymous lifetime #1 defined on the function body at 1:1...
我不明白如何延长这一价值。 它在list.iter()
生存和死亡。 如何在仍仅使用引用的情况下扩展它?
这是我的代码供参考:
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut largest = &list[0];
for &item in list.iter() {
if item > *largest {
largest = &item;
}
}
largest
}
当您for &item
编写代码时,这会破坏迭代器返回的每个引用,从而成为item
T
的类型。 您不想破坏这些引用,而是想保留它们! 否则,当您引用item
,您将引用一个局部变量,该变量不能返回,因为局部变量的寿命不足。
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut largest = &list[0];
for item in list.iter() {
if item > largest {
largest = item;
}
}
largest
}
还要注意我们如何直接比较引用,因为对实现PartialOrd
类型的PartialOrd
也实现PartialOrd
,将比较推迟到其引用对象(即,与原始指针不同,这不是指针比较)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.