在可变引用上进行模式匹配时,为什么我不需要`ref mut`?

问题描述

我正在努力进行销毁/自动取消引用。

我有一段有效的代码我有点明白为什么-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) => {}
}

我正努力了解以下模式为何起作用。我希望模式从一开始就不匹配,但是它匹配并且aabb都是可变引用(不需要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");
        }
    }
}

playground

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...