在下面的代码中,我想保留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
}
您可以在将值绑定到变量的任何地方使用此功能,这种情况随处可见。例如:
if let
, 如上
-
match
表达式:
match opt {
Some(1) => { ... },
Some(p) => { ... },
None => { ... },
}
match reference {
&1 => { ... },
&p => { ... },
}
-
在函数参数中:
fn foo(&p: &i32) { ... }
-
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(使用前将#替换为@)