一、匿名函数
函数f1
返回一个函数变量(匿名)
function f1(n)
log("111111 f1函数执行" .. n)
return function ()
-- n是匿名函数的upvalue
log("111111 f1中的匿名函数执行" .. n)
end
end
其实就相当于
function f1(n)
log("111111 f1函数执行" .. n)
local function f2()
-- n是匿名函数的upvalue
log("111111 f1中的匿名函数执行" .. n)
end
return f2
end
调用测试
local g = f1(100) -- g == f2 只是个函数变量
log("111111 ----------")
g() -- 执行匿名函数
结果
二、可变参数
function f1(...)
print(...)
end
f1(1, 2, 3, 4, 5)
-->输出:1 2 3 4 5
三、select
function f2(...)
-- 用法1:select("#", ...)返回所有参数的数量
local n = select("#", ...)
for i = 1, n do
-- 用法2:select(i, ...)返回从index=i之后所有的参数,如果只取第i位置的可以 a = select(i, ...)
print(select(i, ...))
end
end
f2(1, 2, 3, 4, 5)
-->输出: 1 2 3 4 5
--> 2 3 4 5
--> 3 4 5
--> 4 5
--> 5
四、组合self并传递函数
模拟一种实际运用情况,将函数传到别的脚本执行,比如某个函数需要传入一个函数回调,而又没有多余的参数传递self
,这时候就可以将组合self
后的回调传过去,同时...
保证了回调允许接收多个参数
local params = {} -- 模拟参数列表
function Handler(self, func) -- 注意这里是没有 ... 的
return function(...)
return func(self, ...)
end
end
-- 模拟脚本t
local t = {name = "t"}
function t:f3(...)
-- 表示不同逻辑
print("111我是" .. self.name)
-- 这里打印只是想证明参数全部传进来了
print(select(1, ...))
end
params.CallBack = Handler(t, t.f3)
-- 模拟脚本s
local s = {name = "s"}
function s:f3(...)
-- 表示不同逻辑
print("222我是" .. self.name)
-- 这里打印只是想证明参数全部传进来了
print(select(1, ...))
end
params.CallBack = Handler(s, s.f3)
-- 模拟s脚本处打开通用界面
UIManager:OpenUI("AAA", params)
-- 模拟通用窗口"AAA"处调用
function OnClick(params)
if params.CallBack then
params.CallBack(1, 2, 3, 4, 5)
end
end
-->模拟输出:222我是s
--> 1 2 3 4 5
注:这里也可以将t
或者s
存到params
中,比如params.outer = t
调用时params.CallBack(params.outer,1, 2, 3, 4, 5)