# 表（Table）

URL: https://caijiao.org/lua/table
Source: docs/lua/table.md
Description: 学习 Lua 中最核心的数据结构 Table，包括数组、字典、嵌套表、遍历与常用操作。

`Table` 是 Lua 中唯一的数据结构类型，功能非常强大。

它既可以作为 **数组**、**字典（键值对）**、**对象**，也能实现 **类与模块系统**。

## 🧩 创建表

```lua
-- 空表
local t1 = {}

-- 数组形式
local t2 = {10, 20, 30}

-- 键值对形式
local t3 = {name = "Alice", age = 20}
````

> 表可以同时混合数组与字典结构。

## 📦 访问与修改元素

```lua
local user = {name = "Bob", age = 25}

-- 访问
print(user.name)       -- Bob
print(user["age"])     -- 25

-- 修改
user.city = "Tokyo"
user["age"] = 26
```

## 🧱 作为数组使用

表的索引从 **1 开始**（与 C/Python 不同）。

```lua
local arr = {"Lua", "Python", "Go"}

print(arr[1])  -- Lua
print(#arr)    -- 获取长度：3
```

## 🔁 遍历表

Lua 提供两种常用遍历方式：

### 1️⃣ `ipairs()`：用于顺序数组

```lua
local langs = {"Lua", "Rust", "Go"}

for i, v in ipairs(langs) do
  print(i, v)
end
```

### 2️⃣ `pairs()`：用于键值表

```lua
local user = {name = "Alice", age = 20, city = "Osaka"}

for k, v in pairs(user) do
  print(k, v)
end
```

## 🧰 表操作函数（table 库）

Lua 标准库提供 `table` 模块，包含常用表操作。

```lua
local fruits = {"apple", "banana"}

table.insert(fruits, "orange")
print(table.concat(fruits, ", "))  -- apple, banana, orange

table.remove(fruits, 1)
print(table.concat(fruits, ", "))  -- banana, orange
```

## 🧩 嵌套表

表可以包含表，实现更复杂的结构：

```lua
local student = {
  name = "Tom",
  scores = {math = 95, english = 88}
}

print(student.scores.math)
```

## 🧠 表的引用特性

表是 **引用类型**，复制时仅复制引用，而非内容。

```lua
local t1 = {x = 1, y = 2}
local t2 = t1

t2.x = 99
print(t1.x)  -- 输出 99，同一个引用
```

如果要复制内容，需要手动遍历或使用深拷贝函数。

## 🧠 小结

* `table` 是 Lua 的核心数据结构
* 支持数组与字典混合形式
* 遍历使用 `ipairs()`（顺序）或 `pairs()`（键值）
* 是引用类型，复制表需注意浅拷贝问题
