继续之前的Lua系列教程,这里记录一些关于闭包的内容

闭包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
local function func0(param)
local function f1()
param = param + 10
print(param)
return param
end
local function f2()
param = param + 2
print(param)
return param
end
return f1,f2
end

local sub1,sub2 = func0(10)
sub1() --20
sub2() --22
sub1() --32
sub2() --34

由于 f1 和 f2 是闭包,它们可以访问并修改同一个 param 变量,即使在 func0 执行完毕之后。每次调用这些闭包时,它们都会记住 param 的当前值,并在下一次调用时继续修改它。

upvalue共享(嵌套的闭包)

在Lua中,每个闭包可以有一个upvalue值,或者多个闭包共享一个upvalue数值param

重要的是要理解,upvalue是共享的,并且是在闭包创建时捕获的。这意味着,对于由func0返回的每一个闭包(即f1和f2),它们共享相同的upvalue引用,即它们对param的引用是相同的。因此,当f1或f2修改param的值时,这个改变对其他闭包以及外部函数FunctionMain中可见的param都是可见的。

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
function FunctionMain(param)
local function func0()
local function f1()
param = param + 10
print(param)
return param
end
local function f2()
param = param + 2
print(param)
return param
end
return f1,f2
end
return func0
end

func0 = FunctionMain(10)

local sub1,sub2 = func0()
sub1() --20
sub2() --22
local sub3,sub4 = func0()
sub3() --32
sub4() --34