在下面的代码中,我想在迭代之后保留 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
调用了 Some
和 None
constructors,因为它们各自产生一个 类型的值>选项
。同理,你可以把&
当做引用的构造函数。语法是对称的:
let n = 100;
let reference = &n;
if let &p = reference {
// do something with p
}
您可以在将值绑定(bind)到变量的任何地方使用此功能,这种情况随处可见。例如:
if let
,如上匹配
表达式:match opt { Some(1) => { ... }, Some(p) => { ... }, None => { ... }, } match reference { &1 => { ... }, &p => { ... }, }
在函数参数中:
fn foo(&p: &i32) { ... }
循环:
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/