--[[ function 函数 --]] functionfactorial1(n) if n == 0then return1 else return n * factorial1(n - 1) end end print(factorial1(5)) factorial2 = factorial1 -- 函数可以存在变量里 print(factorial2(5))
-- 可以以匿名函数的方式通过参数传递 functiontestFun(tab,fun)-- 接受一个 table 和一个函数作为参数 for k ,v inpairs(tab) do print(fun(k,v)); end end tab={key1="val1",key2="val2"}; testFun(tab, function(key,val)-- 匿名函数 return key.."="..val; end );
线程
1 2 3 4 5 6 7 8 9
--[[ 线程 在 lua 中的线程实际上是协程, 允许在不同的执行点之间切换, 而无需使用多线程的复杂性和开销 轻量级线程, 它们在单个线程内执行, 并且由程序显式地管理执行的切换点 --]] co = coroutine.create(function()-- 创建协程 print("Hello from coroutine") end) -- 执行协程 coroutine.resume(co) -- Hello from coroutine
--[[ 运算符 --]] -- 算术运算符 a = 21 b = 10 c = a + b print("Line 1 - c 的值为 ", c ) -- 31 c = a - b print("Line 2 - c 的值为 ", c ) -- 11 c = a * b print("Line 3 - c 的值为 ", c ) -- 210 c = a / b print("Line 4 - c 的值为 ", c ) -- 2.1 c = a // b print("Line 5 - c 的值为 ", c ) -- 2 c = a % b print("Line 6 - c 的值为 ", c ) -- 1 c = a^2 print("Line 7 - c 的值为 ", c ) -- 441.0 c = -a print("Line 8 - c 的值为 ", c ) -- -21
-- 关系运算符 a = 21 b = 10 if( a ~= b ) then print("Line 9 - a 不等于 b" ) else print("Line 9 - a 等于 b" ) end
-- 逻辑运算符 and or not a = false b = true if ( a and b ) then print("a and b - 条件为 true" ) else print("a and b - 条件为 false" ) end
-- 其他运算符 ..(连接两个字符串)、#(返回字符串或表的长度) a = "Hello " b = "World" print("连接字符串 a 和 b ", a..b ) -- Hello World print("b 字符串长度 ", #b) print("字符串 Test 长度 ", #"Test" ) print("网址长度 ", #"www.run.com" )
三元操作符:举例
(szMod == nil) and false or szMod Lua 中的三元操作符(条件运算符)模式,用于根据条件选择不同的值
(szMod == nil):检查 szMod 是否为 nil
如果 szMod 为 nil,则表达式结果为 true
否则表达式结果为 false
and false:如果 (szMod == nil) 为 true,则返回 false
or szMod:如果 and 左侧为 false(即 (szMod == nil) 为 false),则返回 szMod 的值
3. 控制语句
3.1 循环
Lua 语言提供了以下几种循环处理方式:
循环类型
描述
while 循环
在条件为 true 时,让程序重复地执行某些语句。执行语句前会先检查条件是否为 true。
for 循环
重复执行指定语句,重复次数可在 for 语句中控制。
repeat…until
重复执行循环,直到 指定的条件为真时为止
循环嵌套
可以在循环内嵌套一个或多个循环语句(while do … end;for … do … end;repeat … until;)
--[[ 循环 --]] -- while 循环 a = 10 while( a < 20 ) do print("a 的值为:", a) a = a+1 end
-- for 循环 -- 数值 for 循环 for i=10,1,-1do print(i) end -- 泛型 for 循环 a = {"one", "two", "three"} for i, v inipairs(a) do-- ipairs是Lua提供的一个迭代器函数, 用来迭代数组 print(i, v) end
-- repeat...until 循环 --[ 变量定义 --] a = 10 --[ 执行循环 --] repeat print("a的值为:", a) a = a + 1 until( a > 15 )
-- 循环嵌套 j=2 for i=2,10do for j=2,(i/j),2do if(not(i%j)) then break end if(j > (i/j))then print("i 的值为:",i) -- 8 9 10 end end end
t = { apple = "a", banana = "b", eraser = "c" } for i,j inpairs(t) do print(i, j) -- banana b eraser c apple a end
-- table 的键值对是存储在哈希表中的, 存储顺序是不确定的 t = { a = 1, b = 2, c = 3 } print(next(t)) -- a 1 -- 第二个参数是表中的某个键 -- next 返回该键的下一个键及其关联的值 -- 每次结果不同, 返回的顺序不同, 因为底层实现是哈希表 print(next(t, "a")) -- b 2
local bag = {} local bagmt = { put = function(self, item) table.insert(self.items, item) end,
-- take 方法从 items 表中取出最后一个元素 take = function(self) returntable.remove(self.items) end,
list = function(self) returntable.concat(self.items, ",") end,
clear = function(self) self.items = {} end } -- 将 bagmt 设为元表,并将 __index 指向自己 bagmt["__index"] = bagmt -- 定义 bag 的构造函数 functionbag.new() local instance = { items = {} } -- 设置元表,使得未定义的元素从 bagmt 中查找 setmetatable(instance, bagmt) return instance end
-- 创建 bag 对象 b local b = bag.new() -- 调用 b 的 put 方法 b:put("apple") b:put("apple") b:put("apple") b:put("apple") print(#(b.items)) -- 4 print(b:list()) -- apple,apple,apple,apple print(b:take()) -- apple b:clear() print(#(b.items)) -- 0