包含最重要概念、函数、方法等的 Lua 备忘单。 初学者的完整快速参考。
入门 下载 macos 使用 homebrew 下载
其它下载方式
hello world 1 2 3 #!/usr/bin/env lua print ("Hello World!" )
运行 1 2 3 4 $ lua ./hello.lua $ chmod +x hello.lua ./hello.lua
注释 单行注释
多行注释 多行注释以 --[[
开头, 以 ]]
结尾
type() 函数 使用 type()
函数可以判断变量或者值的类型
1 2 print (type (true )) print (type (nil ))
number Lua 默认只有一种 number 类型 double (双精度) 类型
1 2 3 print (10 )print (0.3 )print (2 e + 10 )
string 1 2 3 4 local str1 = 'str1' local str2 = "str2"
[[]]
使用 [[]]
跨行表示多个字符串
1 2 3 4 5 6 7 8 9 10 11 local html = [[ <html> <head></head> <body> <a href="https://www.twle.cn/"> 简单编程 </a> </body> </html> ]] print (html)
字符串连接(..
) 1 2 3 4 print ("a" .. 'b' )print (157 .. 428 )
字符串长度(#
)
table
迭代 table 默认的初始索引会从 1 开始
1 2 3 4 5 6 7 8 9 10 11 local array = { "apple" , "pear" , "orange" , "grape" }print (array[1 ]) for k, v in pairs (array) do print (k .. " : " .. v) end
指定键 1 2 3 4 5 6 local array = {}array.one = "apple" array["two" ] = "peach" print (array.one) print (array.two)
变量 默认值 变量的默认值均是 nil
1 2 #!/usr/bin/env lua print (b)
全局和局部变量 Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量
1 2 3 4 5 6 7 8 9 #!/usr/bin/env lua function main () local b = 12 a = 23 end main() print (a) print (b)
赋值 1 2 a = "hello " .. "world" t.n = t.n + 1
交换变量 1 2 3 4 local x, y = 1 , 3 x, y = y, x print (x, y)
1 2 3 4 5 6 7 8 local tab = {}tab.one = 2 tab.two = 1 tab["one" ], tab["two" ] = tab.two, tab.one print (tab.one, tab.two)
赋值个数不一致
如果变量个数大于 值的个数,按变量个数补足 nil
1 2 a, b, c = 1 , 3 print (a,b,c)
如果变量个数小于 值的个数,多余的值会被忽略
1 2 3 a = 1 local a, b = a, a + 1 , a + 2 print (a, b)
运算符
:-
:-
+
加法
-
减法
*
乘法
/
除法
%
取余,求出除法的余数
^
乘幂,计算次方
-
负号,取负值
1 2 3 4 5 6 7 8 local a, b = 4 , 3 print (a + b) print (a - b) print (a / b) print (a * b) print (a % b) print (a ^ b)
类型转换
goto 语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 local function isValidNumber (num) if type (num) ~= "number" then goto invalidNumber end print ("Valid number:" , num) return true ::invalidNumber:: print ("Invalid number:" , num) return false end isValidNumber(123 ) isValidNumber("abc" )
条件语句 运算符 关系运算符
符号
含义
==
等于
~=
不等于
>
大于
<
小于
>=
大于等于
<=
小于等于
1 2 3 4 5 6 7 8 local a, b = 4 , 3 print (a < b) print (a <= b) print (a == b) print (a ~= b) print (a > b) print (a >= b)
逻辑运算符
符号
含义
and
逻辑与
or
逻辑或操作符
not
逻辑非操作符
1 2 3 4 local a, b = true , false print (a and b) print (a and not b) print (a or b)
while 循环 1 2 3 4 5 local num = 1 while (num < 5 ) do print ("num 的值为:" , num) num = num + 1 end
if 语句 1 2 3 4 if (0 )then print ("0 为 true" ) end
if .. elseif() .. else 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 local age = 27 ;if (age < 18 )then print ("age 小于 18" ) elseif (age < 25 )then print ("age 小于 25" ) elseif (age < 30 )then print ("age 小于 30" ) else print ("age 大于 30" ) end print ("age 的值为 :" , age)
注意: Lua
中 0
为 true
,但是 Lua
中的 nil
可以当作 false
for 循环 1 2 3 for i = 10 , 1 , -1 do print (i) end
lua 中的 for 循环从参数 1 变化到参数 2,每次变化以参数 3 为步长递增 i,并执行一次表达式
参数三,是可选的,如果不指定,默认是 1
参数二只会在一开始求值,其后不会再进行运算
1 2 3 4 5 6 7 8 local f = function (x) print ("in f(x) " ) return x * 2 end for i = 1 , f(5 ) do print (i) end
repeat…until 循环 1 2 3 4 5 6 local num = 11 repeat print ("num 的值为: " , num) num = num + 1 until (num > 10 )
repeat...until
循环的条件语句在当前循环结束后判断
break 1 2 3 4 5 6 7 8 local num = 11 repeat print ("num 的值为: " , num) num = num + 1 if (num > 15 ) then break end until (num > 20 )
函数 初始化 像变量一样,如果加上 local
那么就是局部函数
1 2 3 local function main () print ("这是一个局部函数" ) end
你也可以将函数赋值给一个变量
1 2 3 local main = function () print ("这是一个局部函数" ) end
返回值 1 2 3 4 5 6 7 8 9 local function min (a, b) if (a < b) then return a else return b end end print (min (1 , 2 ))
参数 1 2 3 4 5 6 7 8 9 local p = function (res) print ("打印自己的风格" , res) end local function main (a, b, p) p(a + b) end main(1 , 2 , p)
多个返回值 1 2 3 4 5 6 7 8 9 10 11 12 13 local function min (a) local sum = 0 local factorial = 1 for i, v in pairs (a) do sum = sum + v factorial = factorial * v end return sum, factorial end local a, b = min ({ 1 , 2 , 3 , 4 })print (a, b)
可变参数(...
) 1 2 3 4 5 6 7 8 9 10 local function average (...) local result = 0 local arg = { ... } for i, v in ipairs (arg ) do result = result + v end return result / #arg end print ("平均值为" , average(1 , 3 , 5 , 7 , 9 , 11 ))
字符串 字符串方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 string .upper ("str" ) string .lower ("STR" ) string .gsub ("aaaa" , "a" , "b" , 3 ) string .gsub ("Today is 29/01/2019" , "%d%d/%d%d/%d%d%d%d" , "a good day." )string .find ("referference" , "fer" ) string .find ("Today is 29/01/2021" , "%d%d/%d%d/%d%d%d%d" ) string .reverse ("fw" ) string .format ("value:%c" , 1 ) string .char (97 ,98 ,99 ,100 ) string .byte ("ABCD" ,4 ) string .len ("abc" ) string .rep ("fw" , n) string .sub ("referference" , 5 , 6 )
正则匹配
:-
:-
%a
与任何字母配对
%c
与任何控制符配对(例如\n)
%d
与任何数字配对
%l
与任何小写字母配对
%p
与任何标点(punctuation)配对
%s
与空白字符配对
%u
与任何大写字母配对
%w
与任何字母/数字配对
%x
与任何十六进制数配对
%z
与任何代表0的字符配对
match 第三个参数可选,默认从 1 开始。如果没有捕获组返回整个字符串,匹配失败返回 nil
1 2 3 4 string .match ( "I have 2 questions for you." , "(%d+) (%a+) " )
gmatch 返回一个迭代器函数,每次调用迭代器函数,如果参数 pattern 描述的字符串没有找到,迭代函数返回nil
1 2 3 4 5 6 7 8 for world in string .gmatch ("I have 2 questions for you." , "%a+" ) do print (world) end
数学方法 常用方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 math .huge math .minintegerlocal a = math .abs (-1 ) local b = math .ceil (1.2 ) local c = math .floor (1.2 ) local d = math .fmod (9.9 , 9 ) local g = math .max (1 , 2 , 3 ) local h = math .min (1 , 2 , 3 ) local r = math .sqrt (3 )
工具方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 local l = math .type (1.2 ) local m = math .type (3 ) local n = math .type ("" ) local e = math .log (4 , 2 ) local f = math .exp (2 ) math .random ()math .random (10 )math .random (10 , 100 )local o = math .ult(1 , 10 )local p = math .tointeger("3" ) local q = math .tointeger(0.32 ) local i, j = math .modf (3.14 )
其它方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 math .pi math .sin (math .pi / 2 ) math .cos (math .pi ) math .tan (math .pi / 4 ) math .acos (1.0 ) math .acos (1.0 ) math .atan (1.0 ) math .rad (90 ) math .deg (math .pi )
table 初始化数组 初始化一个空数组
默认的数组索引从 1 开始
1 2 3 4 5 6 local array = { "a" , "b" , "c" , "d" }array[5 ] = "e" for i = 1 , 5 do print (array[i]) end
多维数组 1 2 3 4 5 6 7 8 9 10 local array = { { "a" , "b" , "c" }, { "d" , "e" , "f" } } for i = 1 , #array do for j = 1 , #array[i] do print (array[i][j]) end end
初始化 table 1 2 3 4 5 6 7 8 9 10 11 12 13 local table = {}table .name = "fw" table .age = "18" table ["sex" ] = "boy" print (#table ) table = nil print (table )
table 方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 local a = { "apple" , "orange" , "peach" }print (table .concat (a, "->" , 2 , 3 )) local a = { "apple" , "orange" , "peach" }table .insert (a, 1 , "pear" )print (a[1 ]) local array = { "a" , "b" , "c" }for i,v in pairs (table .move(array, 1 , 3 , 2 )) do print (v) end local array = { "a" , "c" , "b" }local f = function (a, b) return string .byte (a) - string .byte (b) > 0 end table .sort (array, f)for i, v in pairs (array) do print (v) end
迭代器 无状态的迭代器 1 2 3 4 5 6 7 8 9 10 11 12 function square (d,n) if n < d then n = n + 1 return n, n*n end end for i,n in square,5 ,0 do print (i,n) end
for 循环迭代器 1 2 3 for i, n in pairs ({ 1 , 2 , 3 , 4 }) do print (i, n) end
模块 定义模块 1 2 3 4 5 6 7 8 9 local mod = {}mod .cool = "this is a mod" function mod.test () print ("this is a function" ) end return mod
导入模块 一般我们可以直接使用 require
导入
1 2 3 4 5 6 7 8 9 10 11 local status , mod = pcall (require , "a" )if not status then return end mod .test()print (mod .cool)
私有函数 1 2 3 4 5 6 7 8 9 10 11 local mod = {}local function private () print ("private" ) end function mod.public () private() end return mod
另见