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