# 解构赋值 ## 功能 解构赋值用于一次从 array 或 object 中取出多个值并赋给变量。左侧使用类似元组的括号写法,但 BT 当前不提供独立的 tuple 类型,右侧值仍然保持原来的 array 或 object 类型。 ## 语法 ```bt (a b) = value (a, b) = value ``` 空格分隔和逗号分隔等价,也可以混合使用: ```bt (a, b c) = value ``` ## 参数 - 左侧变量:括号中的变量名列表,第一版只支持普通变量名。 - 右侧 value:必须是 array 或 object。 ## 返回值 解构赋值表达式的返回值为右侧 value,和普通赋值表达式保持一致。 数组解构按下标顺序读取。变量数量少于数组长度时,多余元素会被忽略;变量数量多于数组长度时,缺失位置赋值为 `empty`。 对象解构按左侧变量名读取对象同名字段。字段不存在时,对应变量赋值为 `empty`。 ## 代码示例 数组解构: ```bt arr = [1 2 3] (a b c d) = arr echo a // 1 echo b // 2 echo c // 3 echo d // empty ``` 对象解构: ```bt obj = { id: 23 name: '张三' age: 18 sex: 1 } (name sex missing) = obj echo name // 张三 echo sex // 1 echo missing // empty ``` 单字段对象解构会保持引用语义: ```bt obj = { data: { name: '张三' } } (data) = obj data.name = '李四' echo obj.data.name // 李四 ``` 赋值表达式返回右侧值: ```bt arr = [1 2] result = ((a b) = arr) echo result[0] // 1 echo a // 1 ``` for 循环解构当前 value: ```bt users = [ {name: '张三', age: 18} {name: '李四', age: 20} ] for (name age) in users { echo name echo age } ``` 循环解构只作用于每轮迭代得到的 value,不会改变普通 `for key,value in users` 的语义。 ## 注意事项 右侧不是 array 或 object 时会产生运行时错误: ```bt (a b) = 123 ``` 错误信息: ```text 解构赋值右侧必须是 array 或 object ```