Lua 基础速览
目录
- 注释与输出
- 变量与类型
- 字符串
- 运算符
- 条件分支
- 循环
- 函数与返回值
- 表(Table)
- 作用域与局部变量
- 其他常用技巧
注释与输出
- 单行注释
--,多行注释--[[ ... ]] - 使用
print()打印:print("Hello Lua")
变量与类型
- 声明不需类型;未赋值变量默认为
nil - 动态类型:同一变量可被赋予任意类型的值
- 基本类型:
nil、number、string、boolean、table、function、userdata、thread - 查看类型:
type(x) - 数值是双精度浮点;Lua 5.3 起区分整数/浮点,支持整数除法
//
示例:
lua
a = nil
print(a) -- nil
print(type(a)) -- string 类型的返回值
b = 123
c = "abc"
d = true
字符串
- 字面量用单/双引号,长字符串用
[[ ... ]] - 连接运算符
..,长度运算符#str - 转义如
\n;中文在 UTF-8 下常为 3 字节/字符 - 常用库方法:
string.upper/lower/reverse/find/sub/gsub
示例:
lua
local s = "aBcDeFg"
print("len", #s) -- 长度
print("concat", "foo" .. "bar") -- 拼接
print(string.upper(s), string.lower(s))-- 大小写转换
print(string.reverse(s)) -- 反转
print(string.find(s, "cDe")) -- 起止索引或 nil
print(string.sub(s, 3, 4)) -- 子串
print(string.gsub(s, "cD", "***")) -- 替换
运算符
- 算术:
+ - * / % ^(幂运算),整数除法// - 关系:
> < >= <= == ~= - 逻辑:
and or not(短路求值) - 连接:
.. - Lua 无自增自减
++/--,无复合赋值+=等 - Lua 5.3+ 位运算:
& | ~ << >>
条件分支
- 结构:
if ... then/elseif ... then/else/end - 逻辑真值:除
nil、false外都为真(包括0、空字符串)
示例:
lua
local a = 9
if a > 5 then
print("a > 5")
elseif a == 10 then
print("a == 10")
else
print("other")
end
循环
while:条件为真进入循环repeat ... until:先执行后判断,条件为真结束- 数字
for:for i = start, finish, step do ... end(步长可省略,默认 1) break退出当前循环;Lua 无continue
示例:
lua
-- while
local num = 0
while num < 5 do
print(num)
num = num + 1
end
-- repeat-until
num = 0
repeat
print(num)
num = num + 1
until num > 5
-- for,含自定义步长
for i = 2, 5, 1 do
print(i)
end
函数与返回值
- 定义:
function fname(args) ... end - 多返回值:
return a, b - 变长参数:
function f(a, b, ...) end,...可配合{...}捕获 - 支持闭包:内部函数可访问外部局部变量
示例:
lua
local function add(x, y)
return x + y
end
local function head_and_tail(first, ...)
return first, {...} -- 其余参数打包为表
end
local function make_counter()
local n = 0
return function()
n = n + 1
return n
end
end
表(Table)
- 关联/数组统一用表:
{}创建 - 访问:
t.key或t["key"] - 插入/删除:
table.insert(t, v),table.remove(t, idx) - 遍历:
ipairs(顺序下标),pairs(任意键值) - 浅拷贝示例:
local t2 = {table.unpack(t)}(Lua 5.2+)
示例:
lua
local t = {1, 2, 3, name = "lua"}
print(t[1], t.name)
for i, v in ipairs(t) do print(i, v) end
for k, v in pairs(t) do print(k, v) end
作用域与局部变量
- 默认全局;使用
local声明局部,优先使用local降低污染
示例:
lua
local x = 10
do
local x = 20 -- 仅在块内有效
print(x)
end
print(x)
其他常用技巧
- 转换:
tostring(x)、tonumber("123") - 数学:
math.floor/ceil/abs/sqrt/random - 安全索引:访问可能为 nil 的字段前先判空,或使用局部变量缓存
- 调试:
print快速查看;复杂结构可用vim.inspect或第三方inspect