Lua 把 Upvalue 转换为常量

我正在编写 Lua 脚本的程序不支持保存 Upvalue。因此,恢复程序状态后函数 fun 将不再有效:

gen=function(par)
    local a=par
    return function() print(a) end
    end
fun=gen(2)

另一方面,像 gen 这样没有闭包的简单函数会被正常保存和加载。 我想要创建一堆类似于上面的带有不同参数 a 值的函数。程序中的等效语句如下:

fun1=function()
    local a=1
    print(a)
end
fun2=function()
    local a=2
    print(a)
end
-- 等等

有可能实现这一点吗?

点赞
用户570336
用户570336

你可以创建一个与函数行为完全一致的表格(但由于它是表格,希望能够正确恢复):

gen = function(par)
    return setmetatable({a = par}, {
            __call = function(self)
                print(self.a)
            end
        })
end

fun = gen(1)  -- 注意:fun是一个表格,但可以像函数一样调用。
fun()

如果需要向表格函数添加参数,可以通过向 __call 元方法添加参数来简单实现:

gen = function(par)
    return setmetatable({a = par}, {
            __call = function(self, something)
                print(self.a, something)
            end
        })
end

fun = gen(1)
fun("foobar")   -- 输出 "1   foobar"

请查看《Lua手册》中的“元表和元方法”一节获取更多信息!

2016-05-31 09:11:22