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

标签 lua

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

相关文章:

lua - table.getn 已弃用 - 如何获取数组的长度?

c++ - 随着线程数的增加,Lua 会扼杀多线程性能(包括条形图)

c++ - lua + 视觉 C++ 2008 : fatal error LNK1107

lua - 根据哈希键名批量删除redis哈希值

rest - 云到设备 Azure IoT REST API

Lua 成语合二为一

go - 为什么这个Go程序这么慢?

Lua - 需要回退/错误处理

python - 编译 lunatic-python 时出错

c++ - 为嵌入式 Lua 设置超时