# Lua 高级技巧与优化

URL: https://caijiao.org/lua/advanced
Source: docs/lua/advanced.md
Description: 学习 Lua 的高级编程技巧，包括性能优化、内存管理、闭包、尾递归优化和元表高级用法。

Lua 是一门灵活的脚本语言，高级技巧可以让代码更加高效、优雅，同时减少内存占用和性能开销。

## 🧩 尾递归优化

Lua 支持 **尾递归优化**，在函数最后调用自身时不会增加调用栈。

```lua
function factorial(n, acc)
  acc = acc or 1
  if n == 0 then
    return acc
  else
    return factorial(n - 1, n * acc)  -- 尾递归
  end
end

print(factorial(1000))  -- 大数也不会栈溢出
````

> 尾递归可用于实现循环逻辑而不消耗额外栈空间。

## 🧶 闭包（Closure）

闭包可以 **保存函数外的局部变量状态**，实现数据封装。

```lua
function counter()
  local count = 0
  return function()
    count = count + 1
    return count
  end
end

local c = counter()
print(c())  -- 1
print(c())  -- 2
```

## 📦 table 优化技巧

1. **预分配表大小** 避免频繁扩容：

```lua
local t = {}
for i = 1, 1000 do
  t[i] = i
end
```

2. **数组与哈希表分开**，避免混用导致性能下降。

3. **使用局部变量访问表元素**，比全局访问快：

```lua
local t = {x=10, y=20}
local x = t.x
print(x)
```

## 🔄 元表高级用法

* 使用 `__index` 和 `__newindex` 实现属性访问控制
* 使用 `__add`, `__sub` 等运算符重载实现对象行为
* 利用元表实现简单的类系统和继承机制

```lua
local Vector = {}
Vector.__index = Vector

function Vector:new(x, y)
  return setmetatable({x=x, y=y}, self)
end

function Vector:__add(v)
  return Vector:new(self.x + v.x, self.y + v.y)
end
```

## 🧠 内存与性能优化

* 避免频繁创建短生命周期的表或字符串
* 使用局部变量代替全局变量
* 尽量使用 `ipairs` 遍历数组，比 `pairs` 更快
* 避免在循环中重复计算长度，如 `#t` 放在循环外

## 🧩 调试技巧

* 使用 `print` 或 `io.write` 简单调试
* 使用 `debug` 库进行堆栈跟踪、检查变量
* LuaJIT 提供高性能的调试和性能分析工具

## 🧠 小结

* 尾递归优化提高递归效率
* 闭包实现数据封装和状态保存
* 合理使用表和元表提高性能与可维护性
* 注意内存管理和局部变量使用
* 调试工具有助于快速定位问题
