通过解构元组获得的变量是可变的吗?

Are variables obtained by destructuring a tuple mutable?

提问人:Rex Eleven 提问时间:2/4/2023 最后编辑:cafce25Rex Eleven 更新时间:2/4/2023 访问量:75

问:

解构元组是否使变量可变?

这是让我感到困惑的代码片段:

let tup = ("duck", 11, true);

let (_, data, ..) = tup;
println!("data: {}", data);

let (_, .., data) = tup; // I expected that this is not available
println!("data: {}", data);

data = "what"; // like this, but then this one why not?
元组 解构 可变

评论


答:

3赞 Finomnis 2/4/2023 #1

let实际上定义了一个新变量。因此,在您的代码中,存在两个变量,一个由第一个变量创建,一个由第二个变量创建。dataletlet

也就是说,第二个遮了第一个的名字,使第一个存在于背景中的某个地方,但无法访问,因为它的名字已被第二个重复使用。let data

这也是为什么你不需要将第一个声明为 - 你永远不会改变它的原因。它仍然存在于后台,新变量只是偷了名字。datamutdata

最后一行失败,因为现在引用了第二个对象,即布尔值。并且您不能将字符串分配给布尔值。除此之外,它没有声明,所以即使你写了,它也不会编译。datadatamutdata = false;

您可以将最后一行替换为 ,然后它将编译。但是你现在有三个变量,前两个是阴影。let data = "what";data

为了证明它实际上是阴影的,这里有一个小例子。它暂时遮蔽嵌套作用域内的变量;在作用域之后,可以再次访问上一个变量,因为嵌套的变量被删除了:

fn main() {
    let tup = ("duck", 11, true);

    let (_, data, ..) = tup;
    println!("data: {}", data);

    {
        let (_, .., data) = tup;
        println!("data: {}", data);
    }

    println!("data: {}", data);
}
data: 11
data: true
data: 11