2

bind()クロージャーを作成するために Javascript で広く使用されている Luaに実装したいと考えています。

以下のコードは、引数が 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

私の質問は次のとおりです。任意の数のバインド引数をサポートするにはどうすればよいですか?

4

4 に答える 4

1

unpackN引数のテーブルをアンパックする関数を定義します。

function unpackN(argss, i)
    i = i or 1

    local iLocal = i
    for _, args in ipairs(argss) do
        local argsN = #args

        if iLocal <= argsN then
            return args[iLocal], unpackN(argss, i+1)
        end

        iLocal = iLocal-argsN
    end
end

次のように使用します。

function bind(func, ...)
    local A = {...}
    return function (...)
        local B = {...}
        return func(unpackN {A, B} )
    end
end
于 2013-08-14T13:25:24.230 に答える