【问题标题】:References in element variable of for loop [duplicate]for循环的元素变量中的引用[重复]
【发布时间】: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

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


另外,我知道i32 实现了Copy-trait,但由于我没有在这段代码中的任何地方移动所有权(因为一切都是参考),所以不应该在这里使用它,对吧?


最后,如果我离开.iter()-call,它也可以工作。我假设编译器从&i 定义推断出应该使用iter()(而不是iter_mut()into_iter()),对吗?

【问题讨论】:

  • 我不明白你的意思,不应该使用 Copy。例如,当您返回值时使用它。
  • @DenysSéguret 暂时忽略最后的回报,它在其他地方使用过吗?

标签: rust


【解决方案1】:

for &i in arr.iter() {

你没有添加&:这是pattern matching。您将&i 与迭代结果相匹配,因此删除 &

实际上就像在做

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

【讨论】:

  • 你能扩展假设 B 吗?
  • max 的类型是 i32,而不是 &i32
  • 是的,但为什么呢?如前所述,应该使用 IndexMut 特征,它表示它将返回 &mut i32。为什么是i32
  • IndexMut 如果索引位于赋值的左侧,而不是右侧,或者 max = &mut arr[0] 将使用。它还需要数组是可变的。这里使用的 trait 是 Index
  • 这很有趣,我没有意识到分配的一面是相关的!但这是否意味着arr[0] 返回一个&i32(正如 Index-trait 定义的那样)?
猜你喜欢
  • 2018-07-28
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 2020-04-05
  • 2013-06-24
  • 2012-10-24
  • 1970-01-01
相关资源
最近更新 更多