问题描述
我正在努力进行销毁/自动取消引用。
我有一段有效的代码,我有点明白为什么-a
是可变的,并且我们将可变的引用传递给match
。在match
语句中,我们有一个期望可变引用的模式,并且我们采用内部变量作为避免将它们移出的引用。
let x = vec![1,2];
let y = vec![3,4];
let mut a = (x,y);
match &mut a {
&mut (ref aa,ref bb) => {}
}
我正努力了解以下模式为何起作用。我希望模式从一开始就不匹配,但是它匹配并且aa
和bb
都是可变引用(不需要ref mut
)。我觉得这是在自动取消引用:
match &mut a {
(aa,bb) => {
aa[0] = 2;
}
}
解决方法
我觉得这是在自动取消引用吗?
我不会将其称为“自动”取消引用,因为您取消引用匹配的值的意图已明确表示为销毁模式的一部分。但是,是的,当您将可变引用与具有可变引用的模式匹配时,与取消引用匹配的值相同。您可以在下面的简单代码示例中看到这一点:
fn main() {
for num in &[1,2,3] {
// type of `num` inside loop is &i32
// explicit deref required for equality check
if *num == 3 {
println!("found 3");
}
}
// implicit deref in destructuring pattern
for &num in &[1,3] {
// type of `num` inside loop is i32
// no need for explicit deref operation now
if num == 3 {
println!("found 3");
}
}
}