syntax - 在 for 循环中引用/取消引用向量元素

标签 syntax reference rust pattern-matching

在下面的代码中,我想在迭代之后保留 number_list,因为 for 使用的 .into_iter()默认会消耗。因此,我假设 n: &i32 并且我可以通过取消引用获得 n 的值。

fn main() {
    let number_list = vec![24, 34, 100, 65];
    let mut largest = number_list[0];

    for n in &number_list {
        if *n > largest {
            largest = *n;
        }
    }

    println!("{}", largest);
}

我了解到,我们可以使用 &n 作为“模式”来代替它:

fn main() {
    let number_list = vec![24, 34, 100, 65];
    let mut largest = number_list[0];

    for &n in &number_list {
        if n > largest {
            largest = n;
        }
    }

    println!("{}", largest);
    number_list;
}

我的困惑(请记住我没有涉及模式)是我希望从 n: &i32 开始,然后是 &n: &&i32 而不是解析到值(如果双引用甚至可能)。为什么会发生这种情况,& 的含义是否因上下文而异?

最佳答案

将引用视为一种容器会有所帮助。为了进行比较,请考虑 Option,我们可以在其中使用模式匹配“展开”值,例如在 if let 语句中:

let n = 100;
let opt = Some(n);

if let Some(p) = opt {
    // do something with p
}

我们为 Option 调用了 SomeNone constructors,因为它们各自产生一个 类型的值>选项。同理,你可以把&当做引用的构造函数。语法是对称的:

let n = 100;
let reference = &n;

if let &p = reference {
    // do something with p
}

您可以在将值绑定(bind)到变量的任何地方使用此功能,这种情况随处可见。例如:

  1. if let,如上

  2. 匹配表达式:

    match opt {
        Some(1) => { ... },
        Some(p) => { ... },
        None    => { ... },
    }
    match reference {
        &1 => { ... },
        &p => { ... },
    }
    
  3. 在函数参数中:

    fn foo(&p: &i32) { ... }
    
  4. 循环:

    for &p in iter_of_i32_refs {
        ...
    }
    

可能more .

请注意,最后两个不适用于 Option,因为如果找到 None 而不是 Some,它们会 panic,但是引用不会发生这种情况,因为它们只有一个构造函数,&

does the meaning of & differ depending on context?

希望,如果您可以将 & 解释为构造函数而不是运算符,那么您会发现它的含义没有改变。 Rust 的一个非常酷的功能是您可以在表达式的右侧使用构造函数来创建值,并在左侧使用构造函数将它们分开(解构)。

关于syntax - 在 for 循环中引用/取消引用向量元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52203375/

相关文章:

rust - 为什么 '?'在这里不能与from_str_radix一起使用

for-loop - 将嵌套的 for 循环转换为迭代器

r - 加载与安装库的语法。

检查值是否已存在于数组中

html - 我应该在 <a> 内嵌套 <i> 还是在 <i> 内嵌套 <a>?

c++ - 为什么我不能用 `ofstream` 的实例初始化对 `ifstream`/`fstream` 的引用?

Rust "extern mod std;"失败

c++ - const T* 与 typedef

C++ 运算符重载?

c - 如何在 C 中通过引用将数组指针传递给函数?