提问人:Rex Eleven 提问时间:2/4/2023 最后编辑:cafce25Rex Eleven 更新时间:2/4/2023 访问量:75
通过解构元组获得的变量是可变的吗?
Are variables obtained by destructuring a tuple mutable?
问:
解构元组是否使变量可变?
这是让我感到困惑的代码片段:
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
实际上定义了一个新变量。因此,在您的代码中,存在两个变量,一个由第一个变量创建,一个由第二个变量创建。data
let
let
也就是说,第二个遮蔽了第一个的名字,使第一个存在于背景中的某个地方,但无法访问,因为它的名字已被第二个重复使用。let data
这也是为什么你不需要将第一个声明为 - 你永远不会改变它的原因。它仍然存在于后台,新变量只是偷了名字。data
mut
data
最后一行失败,因为现在引用了第二个对象,即布尔值。并且您不能将字符串分配给布尔值。除此之外,它没有声明,所以即使你写了,它也不会编译。data
data
mut
data = 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
评论