# 解构赋值

## 功能
解构赋值用于一次从 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
```
