什么是 Lua 的闭包函数?

根据指南(https://www.tutorialspoint.com/lua/lua_quick_guide.htm),它说:

array = {"Lua", "教程"}

function elementIterator (collection)

   local index = 0
   local count = #collection

   -- 闭包函数被返回

   return function ()
      index = index + 1

      if index <= count
      then
         -- 返回迭代器的当前元素
         return collection[index]
      end

   end

end

for element in elementIterator(array)
 do
   print(element)
end

什么是 Lua 的闭包函数?

点赞
用户6632736
用户6632736

在Lua中,任何函数都是闭包。在更窄的意义上,闭包是一个匿名函数,例如你示例中的返回函数。

闭包是第一类对象:它们可以被赋值给变量、传递给函数并从函数中返回。它们可以是Lua tables 中的键和值。

与PHP或C++不同,闭包可以访问局部作用域中的所有变量 - _upvalues_(例如你的示例中的“index”和“count”,它们保留迭代器状态,以及“collection”)而无需显式声明upvalues。当代码执行离开设置它们的块时,upvalues会继续存在。

没有闭包(或子例程)就不能编写迭代器。在你的示例中(一个简单的迭代器),elementIterator是一个接收一个表并返回另一个函数(闭包)的函数。这个返回的闭包会被通用的for指令一遍又一遍地调用,直到它返回nil

你可能会发现这篇论文很有趣:https://www.lua.org/doc/jucs17.pdf

2020-09-23 07:28:50