我想为 Lua 实现 bind()
,它在 Javascript 中广泛用于创建闭包。
下面的代码演示了 1 个参数案例:
function bind(func, arg1)
return function (...)
return func(arg1, ...)
end
end
local x = { data = 1 }
function x.print(self)
print self.data
end
outputX = bind(x.print, x)
outputX() -- print 1
我的问题是:如何支持任意数量的绑定(bind)参数?
最佳答案
与 lua-vararg你可以这样写:
local va = require "vararg"
function bind(f, ...)
local outer_args = va(...)
local function closure (...)
return f(va.concat(outer_args, va(...)));
end
return closure;
end
bind(print, 1, 2, 3)(4,5,6)
这是纯lua实现
function packn(...)
return {n = select('#', ...), ...}
end
function unpackn(t)
return (table.unpack or unpack)(t, 1, t.n)
end
function mergen(...)
local res = {n=0}
for i = 1, select('#', ...) do
local t = select(i, ...)
for j = 1, t.n do
res.n = res.n + 1
res[res.n] = t[j]
end
end
return res
end
function bind(func, ...)
local args = packn(...)
return function (...)
return func(unpackn(mergen(args, packn(...))))
end
end
bind(print, 1, nil, 2, nil)(3, nil, 4, nil)
关于lua - 如何为 Lua 实现 bind()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18229180/