我正在寻找一种在 Lua 表上进行映射/选择的好方法。
例如。我有一张桌子:
myTable = {
pig = farmyard.pig,
cow = farmyard.bigCow,
sheep = farmyard.whiteSheep,
}
如何编写 myTable.map(function(f) f.getName)?[假设所有农场动物都有名字]
IE。将该函数应用于表中的所有元素。
写你自己的版本?在 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
如果您使用的是 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 中。
使用元表的优雅解决方案:
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
并不总是为相同的输入返回相同的结果,那么由于函数调用被延迟,那么结果表的行为可能会有所不同取决于f
创建表时的行为方式以及首次索引每个键的时间。
好吧,所有其他答案都提供了慢速地图功能。当表格中的元素不止几个时,您将能够看到性能差异。
这是纯 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:这段代码取自这篇文章
这是 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 它包含代码和解释。