Lua函数进阶 - 下
1 闭包
--闭包 --无参数闭包 function Func() --local i 相当于Java中的静态变量 local i = 0; --i 变量,称为内嵌函数的 "upValue",这里的i变量,既不是全局变量,也不是局部变量. 这里称为非局部变量 print("---A--i: "..i) return function() --内嵌入的匿名函数 print("---B--i: "..i) i = i + 1 print("---C--i: "..i) return i; end end --调用测试 f1 = Func() print(f1()) print(f1())
2 带参闭包
--带参闭包 function FunWithPara(i) --参数i 是内嵌函数的"UpValue" print("---A--i: "..i) return function() --内嵌匿名函数 print("---B--i: "..i) i = i + 1 print("---C--i: "..i) return i end end --调用测试 fun2 = FunWithPara(10) print(fun2()) print(fun2())
3 多内嵌函数闭包
--具备多个内嵌函数的闭包 function FunMuTil() local numUpValue = 10 --这是所谓的upValue function InnerFun1() print(numUpValue) end function InnerFun2() numUpValue = numUpValue + 100 end return InnerFun1,InnerFun2 end --调用测试 local res1,res2 = FunMuTil() res1() -- output:10 res2() -- output: res1() -- output:110
4 带参数的内嵌函数
--带参数的内嵌函数 function Fun4(num) return function(value) --内嵌函数带有参数 --return num * value --这种写法不能保存num自身状态 num = num * value return num end end --调用测试 fun4 = Fun4(10) print(fun4(2)) --output: 20 print(fun4(2)) --output: 40
5 闭包具备多个实例
--闭包可以有多个实例 function Func5() local i = 0; return function() i = i + 1 return i; end end --调用测试 res51 = Func5() print(res51()) --output: 1 print(res51()) --output: 2 print(res51()) --output: 3 res52 =Func5() print(res52()) --output: 1 print(res52()) --output: 2 print(res52()) --output: 3
6 自定义迭代器
--使用闭包,开发自己的迭代器 function Itr(table) local i = 0 return function() i=i+1 return table[i] end end --定义一个表 myTab = {1,22,333,4444,55555} --迭代输出 iterator = Itr(myTab) while true do local j = iterator() if (j==nil) then break end print("j : "..j) end for m in Itr(myTab) do print("for : ",m) end
7 模块
7.1 新建一个lua文件
--模块,本质上就是定义一个表 --定义局部模块 local myModel={} --定义模块中的字段 myModel.gHeight=180 --定义模块中的函数 --模块中不能定义私有的函数与字段,否则无法调用 function myModel.Fun1() print("Fun1 Method invoked !") end function myModel.Fun2() print("Fun2 Method invoked !") end return myModel
7.2 在别的文件中调用
--lua文件的相互调用 关键字require local model = require("LuaMiddle.C1_MyModel") if (not model) then print("model 不存在") return end --模块的调用 model.Fun1() --测试模块中的函数 model.Fun2() print("模块中的字段 : "..model.gHeight)
8 函数的前置声明
--函数的前置声明 local fun1 , fun2 function fun1() print"---Fun1---" end function fun2() print("--Fun2--") end fun1() fun2()
9 unpack函数
unpack( )函数是接受一个数组来作为输入参数,并默认从下标为1开始返回所有元素
--unpack函数,在5.3版本中 unpack() 应改为 table.unpack() 调用 myTab = {1,2,3,4,5,6,nil,0} print(table.unpack(myTab))
--模块,本质上就是定义一个表--定义局部模块local myModel={}
--定义模块中的字段myModel.gHeight=180--定义模块中的函数--模块中不能定义私有的函数与字段,否则无法调用function myModel.Fun1()print("Fun1 Method invoked !")end
function myModel.Fun2()print("Fun2 Method invoked !")end
return myModel