是否存在与Scala的地图或C#的Select函数相当的lua?

时间:2012-07-26 13:03:26

标签: select map lua

我正在寻找一种在Lua桌上进行地图/选择的好方法。

例如。我有一张桌子:

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

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

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

5 个答案:

答案 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 它包含代码和说明。