【发布时间】:2019-07-10 14:29:00
【问题描述】:
我很难理解为什么来自The Rust Book, Chapter 10 的这个 sn-p 有效:
fn largest(arr: &[i32]) -> i32 {
let mut max = arr[0];
for &i in arr.iter() {
if i > max {
max = i;
}
}
max
}
假设 A: 使用 arr.iter() 将在迭代时返回对数组/切片/向量中项目的引用。所以i 将是&i32 类型。在定义中添加额外的& 将使其成为对引用的引用,因此&&i32。
假设 B:IndexMut 特征(在第 2 行中使用)将返回对索引项的可变引用,因此在本例中为 &mut i32。
这两个假设都是错误的,因为i 和max 都是i32 类型。为什么?
另外,我知道i32 实现了Copy-trait,但由于我没有在这段代码中的任何地方移动所有权(因为一切都是参考),所以不应该在这里使用它,对吧?
最后,如果我离开.iter()-call,它也可以工作。我假设编译器从&i 定义推断出应该使用iter()(而不是iter_mut() 或into_iter()),对吗?
【问题讨论】:
-
我不明白你的意思,不应该使用 Copy。例如,当您返回值时使用它。
-
@DenysSéguret 暂时忽略最后的回报,它在其他地方使用过吗?
标签: rust