我很难理解为什么The Rust Book, Chapter 10的这段代码有效:
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
特征,但是由于我没有将所有权移到此代码的任何位置(因为所有内容都是引用),因此不应在此处使用它,对吧?
最后,如果我离开.iter()
-电话,它也会起作用。我假设编译器根据&i
的定义推断出,应该使用iter()
(而不是iter_mut()
或into_iter()
),对吗?
答案 0 :(得分:1)
在
for &i in arr.iter() {
您不是添加一个&
:这是pattern matching。您正在将&i
与迭代结果进行匹配,从而删除 &
。
实际上就像在做
for i in arr.iter() {
let i = *i;