Rust书列出10-16:期望类型`T`找到类型`& T`

时间:2018-01-10 15:09:40

标签: rust

当我尝试实施以下修改时,我被困在Listing 10-16

  

如果我们将返回类型更改为&T而不是T并更改正文   返回引用的函数,我们不需要   CloneCopy特征边界,我们不会做任何堆   分配。尝试自己实施这些替代解决方案!

我的代码是

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`

1 个答案:

答案 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;
    }
}