我是 Rust 的新手,只是在尝试一些代码:
fn array_leaders(arr: &[i32]) -> Vec<i32> {
let mut res = Vec::new();
for (i, left) in arr.iter().enumerate() {
let right = arr.iter().skip(i+1).sum();
if left > right { res.push(*left) };
}
res
}
导致以下错误:
error[E0277]: the trait bound `&i32: Sum<&i32>` is not satisfied
--> src/lib.rs:5:42
|
5 | let right = arr.iter().skip(i+1).sum();
| ^^^ the trait `Sum<&i32>` is not implemented for `&i32`
现在,我已经想到了一个方法,就是在if语句中的正确变量右边添加一个&
符号:
if left > &right { res.push(*left) };
这解决了问题。不过我想知道为什么。
right
的那一行,因为Rust试图使所有特征对齐,但解析失败了。它并没有说“我无法比较i32
和&i32
”。它说:“我需要一个&i32
,所以我尝试让sum
返回一个&i32
,但它不起作用”,因为这是编译器的思考方式。 - Silvio Mayolo