for循环的元素变量中的引用

时间:2019-07-10 14:29:00

标签: rust

我很难理解为什么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

鉴于imax均为i32类型,这两个假设都是错误的。为什么?


此外,我了解i32实现了Copy特征,但是由于我没有将所有权移到此代码的任何位置(因为所有内容都是引用),因此不应在此处使用它,对吧?


最后,如果我离开.iter()-电话,它也会起作用。我假设编译器根据&i的定义推断出,应该使用iter()(而不是iter_mut()into_iter()),对吗?

1 个答案:

答案 0 :(得分:1)

for &i in arr.iter() {

您不是添加一个&:这是pattern matching。您正在将&i与迭代结果进行匹配,从而删除 &

实际上就像在做

for i in arr.iter() {
    let i = *i;