不可变的 Rust 变量可以使用解构重新分配吗?

3
我感到很惊讶的是,以下程序会被成功编译并运行(使用“cargo 1.42.0 (86334295e 2020-01-31).”),输出:
5 k
变量x没有被声明为mut,但它不仅被重新赋值,而且被赋予了不同的类型。是否有某些原因允许这样做?
fn main() {

    let x = 5;

    println!("{}", x);

    let t: (i32, f64, char) = (2, 3.14, 'k');

    let (_,_,x) = t;

    println!("{}", x);

}
1个回答

4

这被称为“变量的阴影”

(https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#shadowing)

它也可以简单地显示如下:

let x = 5;
let x = 'k';

这实际上经常很有用。例如,您可以在使用初始分配的值后重复使用标识符:

let two_times_five = 2 * 5; // type i32
let two_times_five = two_times_five.to_string(); // type String

编译器仍将强制执行强类型;在重新定义two_times_five之前访问将访问i32,在之后访问将访问String。
有时您不希望变量是可变的,但在某个时刻您想要为其分配一个不同的值。使用变量屏蔽而不是let mut意味着您知道该变量在其定义之间没有被更改,无论它被传递到哪些函数或对其调用了哪些方法。

啊,好的,谢谢!我主要是从Java转来的,那里你不能真正做任何像这样的事情。 - Chris Loach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接