Lua - 变量与一个固定列表值相比较的最节约资源的方法

我有一个变量,叫做 'ID'。我需要相对于一定数量的值检查这个值。当然,ID 只能匹配其中一个值,所以不会有停在匹配值上的问题,因为其他值都不匹配。同时,变量也有可能不匹配任何给定的值。我的问题是,什么方法是最节约资源的?我想到了两种简单的方法来解决这个问题。因为我在编程时知道这些值,所以我可以使用 'or' 进行设置一个条件,只检查每个值,如下所示:

if (ID == "1" or ID == "16" or ID == "58") then
    --do something--
end

这样做的问题在于,它相当冗长和繁琐。另一种选择涉及一个 foreach 循环,在此之前需要定义一个表格。

values = {"1", "16", "58"}
for _, value in ipairs(values) do
    if(ID == value) then
        return true
    end
end

这样做的好处是可重用的,在我至少需要使用不同的值进行此检查 10 次时很有用,缺点是我怀疑它需要更多的资源。

任何帮助将不胜感激。

点赞
用户805875
用户805875

表格可以用作集合:

interesting = {
   ["1"] = true,["16"] = true,["58"] = true
}

if interesting[ID] then
   -- ...
end

虽然占用更多的内存(每个空表格80字节加上每个条目32字节(在x86_64上IIRC),而将条目数量舍入到下一个二的幂次方),但比将比较链作为Lua指令序列比较要快(至少当事情变得更大时)。

对于少量的值,这并不重要。(如果您受限于CPU并且在您的情况下这非常重要,请在您的程序上下文中测量并查看哪个表现更好。不要在这方面给微基准测试过重的重量 - 缓存行为特别可能在这里产生有趣的影响。)

对于大量比较,这是正确的方法。它也比if- then- else链更灵活。 (您可以在运行时更改事物而无需重新加载代码。)

还要注意,您用于将元素固定在集合中的值并不重要,因此一个相对常见的习惯用法(特别是用于输入处理)是将操作作为函数放入表格中:

keybindings = {
    left = function()  Player:move_left()end,
    right = function()  Player:move_right()end,
    up = function()  Player:jump()end,
    -- ...
}

function onKeyk)
   local action = keybindings [k]
   如果有行动则这样做()结束
end

虽然这肯定比直接比较和内联代码慢,但速度在这里基本上不重要(通常比每秒100x的频率要少得多),而灵活性则非常重要。

2017-07-08 23:15:53