映射varargs函数lua
我希望能够映射具有多个参数的函数,如映射varargs函数lua,lua,functional-programming,variadic-functions,map-function,Lua,Functional Programming,Variadic Functions,Map Function,我希望能够映射具有多个参数的函数,如 function(a, b) return a+b end 放在桌子上,这样我就可以写 answer = varmap(function(a, b) return a+b end, {1, 7, 3}, {5, 4, 8} 但是我对lua Varags和wikibooks上的使用表.getn感到不舒服,当你用#替换它们时,它不起作用并返回“尝试在本地'a'(一个空值)”上执行算术运算。也许你正在寻找这样的东西: function varm
function(a, b) return a+b end
放在桌子上,这样我就可以写
answer = varmap(function(a, b) return a+b end, {1, 7, 3}, {5, 4, 8}
但是我对lua Varags和wikibooks上的使用
表.getn
感到不舒服,当你用#
替换它们时,它不起作用并返回“尝试在本地'a'(一个空值)
”上执行算术运算。也许你正在寻找这样的东西:
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
> 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
或者,这里有一个更复杂的函数,它更一般。对于参数列表,它采用数组,或采用具有任意键的表:
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 = 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
> 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
用法:
local arr = table.imap(function (a, b) return a+b end, {1, 7, 3}, {5, 4, 8})
还有一种可能性:
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
请不要在没有公认答案的情况下留下问题。你在一周前发布了这篇文章,从那以后已经得到了3个答案。公认的答案有助于未来用户更快地解决问题,并奖励对您帮助最大的人。如果这三个答案都没有帮助,也许可以更多地强调你的问题。