当我尝试实施以下修改时,我被困在Listing 10-16:
如果我们将返回类型更改为
&T
而不是T
并更改正文 返回引用的函数,我们不需要Clone
或Copy
特征边界,我们不会做任何堆 分配。尝试自己实施这些替代解决方案!
我的代码是
use std::cmp::PartialOrd;
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut largest: &T = &list[0];
for &item in list.iter() {
if item > largest {
largest = &item;
}
}
largest
}
fn main() {
let number_list = vec![34, 50, 25, 100, 65];
let result = largest(&number_list);
println!("The largest number is {}", result);
let char_list = vec!['y', 'm', 'a', 'q'];
let result = largest(&char_list);
println!("The largest char is {}", result);
}
我收到错误
error[E0308]: mismatched types
--> src/main.rs:7:19
|
7 | if item > largest {
| ^^^^^^^ expected type parameter, found &T
|
= note: expected type `T`
found type `&T`
答案 0 :(得分:10)
list.iter()
为引用提供了对list
元素的迭代器。
使用for &item in ...
语法,尤其是&item
模式,您可以取消引用它并将其用作T
。起初可能是违反直觉的,但在这种情况下&item
执行&item
在大多数其他上下文中会做的相反(例如,当传递给函数时)。
但是,largest
被明确定义为&T
,因此在这种情况下,<
运算符会尝试比较两种不同的类型:T
和&T
从模式中移除&
,一切顺利。
for item in list.iter() {
if item > largest {
largest = item;
}
}