2

我希望能够映射多个参数的像地图可变参数功能卢阿

function(a, b) return a+b end 

功能集成到一个表,这样我可以写的东西一样

answer = varmap(function(a, b) return a+b end, {1, 7, 3}, {5, 4, 8} 

但我不舒服LUA可变参数和维基教科书的code samples使用table.getn,当你与#替换它们不起作用,并返回“attempt to preform arithmatic on local 'a' (a nil value)

+0

请不要在没有接受答案的情况下留下问题。你在一个星期前发布了这个帖子,并从那以后得到了3个答案。接受的答案可以帮助未来的用户更快地解决他们的问题,并奖励帮助最多的人。如果3个答案都没有帮助,也许更多地强调你的问题。 – warspyking

回答

1

还有一个可能性:

local unpack = table.unpack or unpack 

-------------------------------------------------------------------------------- 
-- Python-like zip() iterator 
-------------------------------------------------------------------------------- 

function zip(...) 
    local arrays, ans = {...}, {} 
    local index = 0 
    return 
    function() 
     index = index + 1 
     for i,t in ipairs(arrays) do 
     if type(t) == 'function' then ans[i] = t() else ans[i] = t[index] end 
     if ans[i] == nil then return end 
     end 
     return ans 
    end 
end 

-------------------------------------------------------------------------------- 

function map(f,...) 
    assert(type(f) == 'function','Function expected for 1st arg') 
    local t = {...} 
    return coroutine.wrap(
     function() 
      for t in zip(unpack(t)) do 
      coroutine.yield(f(unpack(t))) 
      end 
     end) 
end 

-------------------------------------------------------------------------------- 
-- Example use 

for item in map(function(a, b) return a+b end, {1, 7, 3}, {5, 4, 8}) do 
    print(item) 
end 

print() 

for item in map(function(a) return a*2 end, {1, 7, 3}) do 
    print(item) 
end 
0

也许你正在寻找的东西是这样的:

function varmapn(func, ...) 
    local args, result = { ... }, {} 
    for arg_i = 1, #(args[1]) do 
     local call_args = {} 
     for arg_list = 1, #args do 
     table.insert(call_args, args[arg_list][arg_i]) 
     end 
     table.insert(result, func(table.unpack(call_args))) 
    end 
    return result 
end 

样品的相互作用:

> answer = varmapn(function (a, b) return a+b end, {1, 7, 3}, {5, 4, 8}) 
> print(answer) 
table: 0x970eb0 
> for i = 1, 3 do print(answer[i]) end 
6 
11 
11 

或者,这里是一个稍微复杂功能较为一般。对于参数列表需要阵列,或它需要的表具有任意的键:

function mapn(func, ...) 
    local args, call_args = { ... }, {} 
    local result = {} 

    for k in pairs(args[1]) do 
     call_args[k] = {} 
    end 

    for arg_list, v in pairs(args) do 
     for k in pairs(args[1]) do  
     table.insert(call_args[k], v[k]) 
     end 
    end 
    for k, v in pairs(call_args) do 
     result[k] = func(table.unpack(v)) 
    end 
    return result 
end 

样品的相互作用:

> answer = mapn(function (a, b) return a+b end, {x=1, y=7, z=3}, {x=5, y=4, z=8}) 
> for k,v in pairs(answer) do print(k .. " = " .. v) end 
z = 11 
y = 11 
x = 6 
> answer = mapn(function (a, b) return a+b end, {1, 7, 3}, {5, 4, 8}) 
> for i = 1, 3 do print(answer[i]) end 
6 
11 
11 
0
local function imap(func, ...) -- imap(func, src_table_1, src_table_2, ...) 
    local result = {} 
    local src_tables_arr = {...} 
    if #src_tables_arr == 1 then 
     for k, v in ipairs(src_tables_arr[1]) do 
     result[k] = func(v) 
     end 
    else 
     for k = 1, #src_tables_arr[1] do 
     result[k] = func(
          (table.unpack or unpack) 
          (
           imap(
            function(src_t) return src_t[k] end, 
            src_tables_arr 
           ) 
          ) 
         ) 
     end 
    end 
    return result 
end 
table.imap = imap 

用法:

local arr = table.imap(function (a, b) return a+b end, {1, 7, 3}, {5, 4, 8})