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

posted @ 2020-03-28 14:21  少林拖地僧  阅读(292)  评论(6编辑  收藏  举报
Live2D