local 声明局部变量,仅在当前作用域(如文件、函数、代码块)内有效nilx, y, z = 1, 2, 3Lua 中所有数值均为 number 类型(内部可能为整数或浮点数,自动转换)
支持多种表示方式:
a = 42-- 十进制b = 0xFF-- 十六进制c = 3.14e-2-- 科学计数法支持常见算术运算(+、-、*、/、%)及位运算(>>、<<、&、|、~)
用双引号 " 或单引号 ' 表示,如:"hello" 或 'world'
使用 [[ ... ]] 包裹的字符串不解析转义字符,适合多行文本
字符串连接使用 .. 运算符
常用字符串函数:
s = "Lua"print(#s) -- 获取长度:3print(string.format("%s %d", "Lua", 5)) -- 格式化输出print(string.sub(s, 2, 3)) -- 取子串:"ua"print(string.char(65, 66)) -- ASCII 转字符:"AB"print(string.byte("A")) -- 字符转 ASCII:65tostring(number):将数字转为字符串
tonumber(string):将字符串转为数字,失败则返回 nil
print(tostring(123)) -- "123"print(tonumber("456")) -- 456print(tonumber("abc")) -- nil#table 获取数组部分的长度(不包含字符串键值)arr = {1, "hello", {x=1}, function()print("func") end}table.insert(arr, "new") -- 尾部插入table.remove(arr, 2) -- 移除第2个元素print(#arr) -- 获取长度print(arr[1]) -- 访问第一个元素dict = { name = "Lua", version = 5.4, say = function()print("Hi") end}dict["extra"] = "some value"-- 等价于 dict.extra = "some value"print(dict.name) -- "Lua"dict.say() -- 调用函数,输出 "Hi"for k, v inpairs(dict) doprint(k, v)end-- 仅遍历数组部分(连续数字下标)for i, v inipairs(arr) doprint(i, v)end两种等价方式:
-- 方式一:直接定义functionadd(a, b)return a + bend-- 方式二:匿名函数赋值add = function(a, b)return a + bendnilreturn 时,返回 nilfunctionmultiReturn()return1, "two", trueendlocal a, b, c = multiReturn()print(a, b, c) -- 1 two truetrue 和 false 两个值false 和 nil 视为“假”,0 和空字符串均为真and:逻辑与or:逻辑或not:逻辑非~= 表示Lua 中没有 ? : 三元运算符,但可用 and 和 or 模拟:
local result = (condition) and"yes"or"no"-- 相当于 condition ? "yes" : "no"示例:
print(0and"yes"or"no") -- "yes"(因为 0 为真)print(niland"yes"or"no") -- "no"if score >= 90thenprint("优秀")elseif score >= 60thenprint("及格")elseprint("不及格")end-- 数值 for:起始值, 结束值, 步长(默认为 1)for i = 1, 10doprint(i)endfor i = 10, 1, -1doprint(i)end-- 注意:循环变量 i 在循环内部不可被修改local i = 1while i <= 5doprint(i) i = i + 1-- Lua 没有 i++ 或 i += 1 语法endlocal i = 1repeatprint(i) i = i + 1until i > 5_G_G 是 Lua 的全局环境表,所有全局变量和函数都存储在其中_G["变量名"] 访问全局变量print、table.insert)也存放在 _G 中a = 10print(_G["a"]) -- 10print(_G["table"]["insert"]) -- function: 地址local s = string.char(0x33, 0x34, 0x35) -- 将 ASCII 码转为字符串 "345"print(string.byte(s, 1)) -- 取第一个字符的 ASCII 码:51(0x33)print(string.format("0x%02X", string.byte(s, 1))) -- 格式化为十六进制:0x33# 获取字符串字节数(对于 ASCII 字符串即字符数)print(#"hello") -- 5print(#"中文") -- 6(UTF-8 下每个中文占 3 字节)table.insert)都基于此。local 避免污染全局空间。#table 只对连续数字下标的数组部分有效,对字典部分无效。x, y = y, x。