Lua 基本语法
Lua 是一种轻量、嵌入式脚本语言,设计简洁灵活,广泛应用于游戏开发(如《魔兽世界》、Roblox)、嵌入式系统和脚本扩展。以下是一个简明实用的 Lua 基本语法手册,涵盖核心语法、数据类型、控制结构、函数、表(Table)等,适合初学者快速上手。
1. Lua 概述
- 特点:
- 轻量:核心库小,适合嵌入式应用。
- 动态类型:变量无需声明类型。
- 基于表的强大数据结构:Table 是 Lua 的核心数据结构。
- 可扩展:支持 C/C++ 扩展和元表(metatable)自定义行为。
- 语法规则:
- 不区分大小写(但建议变量名区分大小写)。
- 语句无需分号(
;
可选,建议省略)。 - 注释:
- 单行:
-- 注释
- 多行:
--[[ 注释 --]]
- 单行:
2. 数据类型
Lua 是动态类型语言,支持以下基本类型:
- nil:表示空值,类似于 null。
local x = nil
print(x) -- 输出: nil
- boolean:
true
和false
。
local flag = true
print(flag) -- 输出: true
- number:表示浮点数(默认 64 位双精度,Lua 5.3+ 支持整数)。
local num = 42
print(num) -- 输出: 42
- string:字符串(不可变),支持单引号
'
或双引号"
。
local str = "Hello"
print(str) -- 输出: Hello
- table:关联数组,类似字典或对象,Lua 的核心数据结构。
local t = { name = "Alice", age = 25 }
print(t.name) -- 输出: Alice
- function:函数是一等公民,可作为变量。
local func = function() print("Hello") end
func() -- 输出: Hello
- userdata:C 语言数据(用户自定义)。
- thread:用于协程(coroutine)。
检查类型:
print(type("Hello")) -- 输出: string
print(type(42)) -- 输出: number
print(type(nil)) -- 输出: nil
3. 变量
- 作用域:
- 全局变量:默认全局,任何地方可访问(不推荐)。
- 局部变量:使用
local
声明,作用域限于当前块。
local x = 10 -- 局部变量
y = 20 -- 全局变量
print(x, y) -- 输出: 10 20
- 命名规则:
- 字母、数字、下划线,不能以数字开头。
- 避免使用 Lua 关键字(如
if
、for
、function
)。
4. 控制结构
4.1 条件语句(if)
local age = 18
if age >= 18 then
print("Adult")
elseif age >= 13 then
print("Teen")
else
print("Child")
end
- 说明:
- 使用
then
开始条件块,end
结束。 elseif
可选,else
可选。
4.2 循环语句
- while 循环:
local i = 1
while i <= 3 do
print(i)
i = i + 1
end
输出:1 2 3
- repeat-until 循环:
local i = 1
repeat
print(i)
i = i + 1
until i > 3
输出:1 2 3
- 说明:先执行再判断,类似于 do-while。
- for 循环:
- 数值型 for:
lua for i = 1, 3 do print(i) end
输出:1 2 3
- 可指定步长:
for i = 1, 5, 2 do
(步长为 2)。
- 可指定步长:
- 泛型 for(遍历表):
lua local t = { "a", "b", "c" } for i, v in ipairs(t) do print(i, v) end
输出:1 a 2 b 3 c
4.3 break 和 return
break
:退出当前循环。return
:从函数返回。
for i = 1, 5 do
if i == 3 then
break -- 退出循环
end
print(i)
end
输出:1 2
5. 函数
- 定义:
function add(a, b)
return a + b
end
print(add(2, 3)) -- 输出: 5
- 匿名函数:
lua local func = function(x) return x * 2 end print(func(5)) -- 输出: 10
- 多返回值:
function getInfo()
return "Alice", 25
end
local name, age = getInfo()
print(name, age) -- 输出: Alice 25
- 可变参数:
function sum(...)
local total = 0
for _, v in ipairs({...}) do
total = total + v
end
return total
end
print(sum(1, 2, 3, 4)) -- 输出: 10
6. 表(Table)
Table 是 Lua 的核心数据结构,兼具数组和字典功能。
- 创建:
local t = { 1, 2, 3 } -- 数组风格
local person = { name = "Alice", age = 25 } -- 字典风格
- 访问:
- 数组索引:
t[1]
(从 1 开始,区别于 C 的 0)。 - 字典键:
person.name
或person["name"]
。
print(t[1]) -- 输出: 1
print(person.name) -- 输出: Alice
- 修改:
t[1] = 10
person.age = 26
- 遍历:
- 数组:使用
ipairs
(按索引顺序)。 - 字典:使用
pairs
(遍历所有键值对)。
for k, v in pairs(person) do
print(k, v)
end
输出:
name Alice
age 26
7. 运算符
- 算术:
+
,-
,*
,/
,%
,^
(幂)。
print(5 + 3) -- 输出: 8
print(2 ^ 3) -- 输出: 8
- 关系:
==
,~=
,<
,>
,<=
,>=
。 - 注意:
~=
表示不等于(不同于!=
)。
print(5 ~= 3) -- 输出: true
- 逻辑:
and
,or
,not
。
print(true and false) -- 输出: false
print(not true) -- 输出: false
- 字符串连接:
..
。
print("Hello" .. " World") -- 输出: Hello World
- 长度:
#
(用于表或字符串)。
local t = {1, 2, 3}
print(#t) -- 输出: 3
print(#"Hello") -- 输出: 5
8. 模块
- 定义模块:
-- mymodule.lua
local M = {}
function M.sayHello(name)
return "Hello, " .. name
end
return M
- 使用模块:
local mymodule = require("mymodule")
print(mymodule.sayHello("Alice")) -- 输出: Hello, Alice
9. 高级特性
9.1 元表(Metatable)
- 用于自定义表的操作(如加法、索引)。
local t = setmetatable({}, {
__add = function(t1, t2)
return { value = t1.value + t2.value }
end
})
t.value = 10
local t2 = { value = 20 }
local result = t + t2
print(result.value) -- 输出: 30
9.2 协程(Coroutine)
- 用于非抢占式多任务处理。
local co = coroutine.create(function()
for i = 1, 3 do
print("Coroutine:", i)
coroutine.yield()
end
end)
coroutine.resume(co) -- 输出: Coroutine: 1
coroutine.resume(co) -- 输出: Coroutine: 2
coroutine.resume(co) -- 输出: Coroutine: 3
10. 注意事项
- 索引从 1 开始:表的默认索引从 1 开始(与 C/C++ 不同)。
- 全局变量风险:避免过多全局变量,使用
local
提高性能和安全性。 - 弱类型:
- Lua 自动转换类型(如字符串和数字在某些操作中)。
print("10" + 5) -- 输出: 15(字符串转为数字)
- 性能:
- Table 是核心数据结构,适合大多数场景。
- 频繁操作大表时注意性能,考虑 C 扩展。
- 调试:
- 使用
print
或io.write
输出调试信息。 - Lua 调试器(如 LuaDebug)可用于复杂项目。
- 兼容性:
- Lua 5.1、5.2、5.3、5.4 有细微差异(如整数支持)。
- 嵌入式环境中检查 Lua 版本。
11. 常见示例
11.1 简单计算器
function calculator(a, b, op)
if op == "+" then
return a + b
elseif op == "-" then
return a - b
else
return "Invalid operator"
end
end
print(calculator(5, 3, "+")) -- 输出: 8
print(calculator(5, 3, "-")) -- 输出: 2
11.2 表操作
local t = { name = "Alice", scores = { 90, 85, 88 } }
table.insert(t.scores, 95) -- 添加元素
print(table.concat(t.scores, ", ")) -- 输出: 90, 85, 88, 95
t.scores[1] = nil -- 删除元素(保留空位)
print(#t.scores) -- 输出: 4(长度仍为 4)
12. 总结
- 核心语法:
- 数据类型:
nil
,boolean
,number
,string
,table
,function
等。 - 控制结构:
if
,while
,repeat
,for
。 - 函数:支持多返回值、可变参数。
- 表(Table):数组和字典的统一实现。
- 推荐实践:
- 使用
local
定义变量,减少全局污染。 - 优先用 Table 组织复杂数据。
- 模块化编程,封装功能到模块。
- 适用场景:游戏开发、脚本扩展、嵌入式系统。
- 学习资源:
- 官方文档:https://www.lua.org/manual/
- Lua 教程:https://www.lua.org/pil/
- 实践:编写简单脚本(如计算器、配置文件解析)。
如果你需要更详细的示例(如元表实现、协程使用、结合 C 扩展)或针对特定场景的 Lua 代码,请告诉我!