Lua 编程学习笔记

1. 变量与常量

Lua 中的变量默认是全局变量,可以使用 local 关键字声明局部变量。

name = "Alice"       -- 全局变量
local age = 30     -- 局部变量

注意事项:建议使用 local 声明变量以避免污染全局命名空间。

2. 数据类型

Lua 支持基本数据类型如 numberstringbooleantable

height = 1.75
isStudent = true
city = "New York"

易错点: Lua 中 nil 表示空值,访问不存在的表元素会返回 nil

3. 条件控制

Lua 使用 ifelseifelse 进行条件判断。

if age > 18 then
    print("Adult")
else
    print("Minor")
end

注意事项:条件语句的结束使用 end

4. 函数

Lua 中的函数使用 function 定义,支持多返回值。

function greet(name)
    return "Hello, " .. name
end

易错点:字符串拼接使用 .. 运算符。

5. 表(table)

表是 Lua 的唯一数据结构,可以用作数组、字典等。

person = {name = "Alice", age = 30}
print(person.name)

注意事项:使用 . 访问表的字段。

6. 元表(metatable)

元表用于扩展表的行为,可以实现操作符重载等。

mt = {
    __add = function(a, b)
        return {value = a.value + b.value}
    end
}
setmetatable(a, mt)
setmetatable(b, mt)
c = a + b

注意事项:使用元方法需定义相应的运算符函数,例如 __add

7. 协程(coroutine)

Lua 支持协程,允许实现多任务并发。

co = coroutine.create(function()
    for i = 1, 3 do
        print(i)
        coroutine.yield()
    end
end)

注意事项:使用 coroutine.resumecoroutine.yield 控制协程执行。

8. 模块与包

Lua 使用 require 加载模块,模块通常返回一个表。

-- mymodule.lua
local M = {}
function M.greet(name)
    return "Hello, " .. name
end
return M

注意事项:模块的内容通常封装在表中,并在末尾使用 return 返回。

高级与小众用法

闭包

Lua 支持闭包,允许函数嵌套并访问外层函数的局部变量。

function makeCounter()
    local count = 0
    return function()
        count = count + 1
        return count
    end
end

counter = makeCounter()
print(counter()) -- 输出: 1

注意事项:闭包允许在函数外部保持局部状态。

环境(Environment)

Lua 允许为表设置环境,使用 setfenvgetfenv 函数操作环境。

env = {}
setfenv(1, env)  -- 设置当前环境为 env

易错点: Lua 5.2 以上版本不再使用 setfenvgetfenv

元方法

元方法用于重载运算符。

mt = {
    __index = function(table, key)
        return "Key not found"
    end
}
setmetatable(person, mt)

注意事项:使用元表时确保正确设置元方法函数。

垃圾回收控制

Lua 提供垃圾回收机制,使用 collectgarbage 控制回收。

collectgarbage("collect")

注意事项:使用 collectgarbage 控制内存管理。

错误处理

Lua 提供 pcallxpcall 进行错误处理。

status, err = pcall(function() error("Something went wrong") end)

注意事项:pcall 返回布尔值表示成功或失败,xpcall 支持自定义错误处理函数。