1.封闭(Closures)
例子如下:根据成绩对名字进行排名,成绩高的在前:
names = {"Peter", "Paul", "Mary"}
grades = {Mary=10, Paul=7. Peter=8}
table.sort(names, function(n1,n2)
return grades[n1] > grades[n2] --compare the grades
end
)
写成函数:
function sortbygrade(names, grades)
table.sort(names, function(n1,n2)
return grades[n1] > grades[n2] --compare the grades
end)
end
以上函数中,grades这个变量被称为外部变量(external local variable,upvalue),
不是全局变量也不是局部变量。
第二个例子:
function newCounter()
local i = 0
return function() --- anonymous function
i = i + 1
return i
end
end
c1 = newCounter()
print(c1()) --->1
print(c2()) --->
尽管i已经在作用域外,因为已经返回,但是因为(closure)而能够正确处理这种情况。(封闭通常指的是一个函数能够加上自己的需要,并能够正确访问该upvalue)。如果我们再次调用newCounter,也将创建一个新的局部变量,因此获得一个新的封闭(closure)。
c2 = newCounter()
print(c2()) --->1
print(c1()) --->3
print(c2()) --->2
关于封闭还有很多用处。