rust - 可以使用解构重新分配 RUST 中的不可变变量吗?

标签 rust immutability destructuring

<分区>

我很惊讶地发现下面的程序可以愉快地编译和运行(使用“cargo 1.42.0 (86334295e 2020-01-31).”),输出:

5 k

没有声明为 mut 的变量 x 不仅被重新赋值,而且被重新赋值了一个不同的类型。 有什么理由允许您这样做吗?

fn main() {

    let x = 5;

    println!("{}", x);

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

    let (_,_,x) = t;

    println!("{}", x);

}

最佳答案

这叫做“隐藏变量”

( 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 意味着您知道变量在其定义之间不会更改,无论它被传递到什么函数或调用它的方法。

关于rust - 可以使用解构重新分配 RUST 中的不可变变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61161013/

相关文章:

javascript - es6 { [a] : b } destructuring mean? 是什么

javascript - 如何将数组的键分配为函数的参数?

Javascript - 如何销毁对象并克隆属性?

regex - 如何编写两个对 Regex::replace_all 的调用?

string - 有没有办法在将迭代器映射到更大的切片内取消引用切片?

没有不可变对象(immutable对象)的推送 Angular 变化检测策略

c# - 不可变对象(immutable对象)是好的做法吗?

rust - 如果通过原子操作进行门控,非原子写入是否可以安全读取?

rust - `Box` 是否模糊了特征边界?为什么在这种情况下我可以将 `dyn FnOnce()` 分配给 `dyn Fn()` ?

java - 为什么分代GC的不可变对象(immutable对象)是 'more efficient'?