gpt4 book ai didi

lua - 如何为 Lua 实现 bind()?

转载 作者:行者123 更新时间:2023-12-04 22:32:38 24 4
gpt4 key购买 nike

我想为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com