10

我正在寻找一种在 Lua 表上进行映射/选择的好方法。

例如。我有一张桌子:

myTable = {
  pig = farmyard.pig,
  cow = farmyard.bigCow,
  sheep = farmyard.whiteSheep,
}

如何编写 myTable.map(function(f) f.getName)?[假设所有农场动物都有名字]

IE。将该函数应用于表中的所有元素。

4

5 回答 5

21

写你自己的版本?在 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
于 2012-07-26T14:41:59.360 回答
2

如果您使用的是 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 中。

于 2012-07-26T13:25:25.680 回答
1

使用元表的优雅解决方案:

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创建表时的行为方式以及首次索引每个键的时间。

于 2018-05-01T22:14:25.897 回答
0

好吧,所有其他答案都提供了慢速地图功能。当表格中的元素不止几个时,您将能够看到性能差异。

这是纯 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:这段代码取自这篇文章

于 2019-07-18T12:48:19.380 回答
-1

这是 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 它包含代码和解释。

于 2019-02-25T04:43:08.730 回答