Rust中通过解构元组获取的变量是否具备可变性?
解构元组不会让变量自动变为可变的
首先明确:解构元组本身不会改变变量的可变性,变量是否可变完全取决于你声明时用的是let还是let mut。
逐个解释你的代码疑问:
为什么
let (_, .., data) = tup;是合法的?
Rust 1.56版本之后,支持在元组解构中使用..跳过任意位置的元素——不管是开头、中间还是结尾,只要剩余的绑定是明确的就行。你之前觉得不允许,可能是记错了旧版本的规则,现在这个写法完全合规。为什么
data = "what";不行?
这里有两个核心问题:- 变量不可变:你用
let声明的data是不可变变量,不管是通过解构还是直接let data = ...声明的,没加mut就不能重新赋值。如果要修改,得把声明改成let mut (_, data, ..) = tup;(对应第一个解构)或者let mut (_, .., data) = tup;(对应第二个解构)。 - 类型不匹配:第一次解构的
data是i32类型(值为11),第二次解构的data是bool类型(值为true),而你要赋值的"what"是字符串类型,就算变量可变,类型不匹配也会报错。
- 变量不可变:你用
举个合法的可变解构示例:
let tup = ("duck", 11, true); let mut (_, data, ..) = tup; data = 22; // 合法:变量可变且类型匹配 println!("data: {}", data); // 输出22
内容的提问来源于stack exchange,提问作者Rex Eleven
相关产品推荐
相关产品推荐

