我正在寻找一种在Lua桌上进行地图/选择的好方法。
例如。我有一张桌子:
myTable = {
pig = farmyard.pig,
cow = farmyard.bigCow,
sheep = farmyard.whiteSheep,
}
如何编写myTable.map(function(f)f.getName)? [假设所有农家畜都有名字]
即。将该函数应用于表中的所有元素。
答案 0 :(得分:5)
编写自己的版本?在lua中没有内置函数来执行此操作。
function map(tbl, f)
local t = {}
for k,v in pairs(tbl) do
t[k] = f(v)
end
return t
end
t = { pig = "pig", cow = "big cow", sheep = "white sheep" }
local newt = map(t, function(item) return string.upper(item) end)
table.foreach(t, print)
table.foreach(newt, print)
产生
pig pig
sheep white sheep
cow big cow
pig PIG
cow BIG COW
sheep WHITE SHEEP
答案 1 :(得分:1)
使用元表的优雅解决方案:
Foo*
结果表仅在必要时计算每个条目,基本上是一个惰性表。
这意味着它也可以在无限的惰性列表和表上工作,但是有一个警告 - 即如果map = function (old_t, f)
return setmetatable({}, {
__index = function (new_t, k)
new_t[k] = f(old_t[k])
return new_t[k]
end
})
end
并不总是为相同的输入返回相同的结果,那么作为函数调用被延迟,然后生成的表可能会有不同的行为,具体取决于创建表时f
的行为方式不同,以及每个键首次编入索引时的行为。
答案 2 :(得分:1)
好吧,所有其他答案都提供了慢速地图功能。当表中包含多个元素时,您将可以看到性能差异。
这是纯lua中最快的map()函数-
function map(f, t)
local t1 = {}
local t_len = #t
for i = 1, t_len do
t1[i] = f(t[i])
end
return t1
end
它不使用循环中的#运算符进行比较,也不执行t1[t1+1]
。两者都很慢。
PS:该代码是from this article
答案 3 :(得分:0)
如果您使用的是Lua 5.1,则可以使用table.foreach()
:
a = { 1, 2, 3 }
table.foreach(a, function(k,v) a[k] = v + 2 end)
table.foreach(a, print)
-- 1 3
-- 2 4
-- 3 5
但这已被弃用,并且不再出现在5.2中。
答案 4 :(得分:0)
这是lua中的map函数的示例-
function(f, t)
local o = {}
for i = 1, #t do
o[#o + 1] = f(t[i])
end
return o
end
请注意:以上实现未优化。它应该适合您的目的。但是,如果您想在lua中最快执行map()函数之一,可以查看一下-Lua Map Function 它包含代码和说明。