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

2024-01-20

在下面的代码中,我想保留number_list,迭代之后,因为.into_iter() that for默认使用会消耗。因此,我假设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, then &n: &&i32而不是解析为值(如果甚至可以使用双引用)。为什么会出现这种情况,其含义是什么&根据上下文而有所不同?


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

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

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

We call Some and None 构造函数 for Option,因为它们各自产生一个类型的值Option。同样的,你可以想到&作为构造函数的参考。并且语法是对称的:

let n = 100;
let reference = &n;

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

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

  1. if let, 如上

  2. match表达式:

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

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

    for &p in iter_of_i32_refs {
        ...
    }
    

并且可能more https://doc.rust-lang.org/book/second-edition/ch18-01-all-the-places-for-patterns.html.

请注意,最后两个不起作用Option因为如果None被发现而不是Some,但是引用不会发生这种情况,因为它们只有一个构造函数,&.

的意思是&根据上下文而有所不同?

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 for 循环中引用/取消引用向量元素 的相关文章

随机推荐