Lua - 将变量与固定值列表进行比较的最有效资源的方法

eri*_*k p 3 lua lua-table

所以我有一个变量,我们称之为'ID'.我需要相对于固定数量的值检查此值.当然,ID只能匹配其中一个值,因此不会出现停止第一个匹配值的问题,因为其他值都不匹配.变量也有可能与任何给定值都不匹配.那么我的问题是,资源效率最高的方法是什么?我可以想到解决这个问题的两种简单方法.由于我知道编程时的值,我可以使用'或'设置条件,只检查每个值,如下所示:

if (ID == "1" or ID == "16" or ID == "58") then
    --do something--
end
Run Code Online (Sandbox Code Playgroud)

这样做的问题在于它写起来非常冗长乏味.另一个选项涉及foreach循环,我预先定义一个表.

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

这样做的好处是它可以重复使用,因为我需要使用不同的值集进行至少10次精确检查,缺点是我怀疑需要更多资源.

任何帮助将不胜感激.

nob*_*ody 8

表可以用作集:

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

if interesting[ID] then
   -- ...
end
Run Code Online (Sandbox Code Playgroud)

虽然它占用更多内存(每个空表80个字节加上32个字节(IIRC,在x86_64上)每个条目(同时将条目数舍入到下一个2的幂),而每个比较16个字节加上存储的值为比较)比较链发生在C中,因此比作为一系列Lua指令的比较链更快(至少一旦事情变大).

对于少量的值,这并不重要.(如果你受CPU约束,这在你的情况下非常重要,请在程序的上下文中进行测量,看看哪些表现更好.不要过分重视微基准测试 - 特别是缓存行为可能会产生搞笑效果在这里.)

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

另请注意,用于锚定集合中元素的值并不重要,因此相对常见的习惯用法(尤其是输入处理)将操作作为函数放入表中:

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

function onKey( k )
   local action = keybindings[k]
   if action then  action( )  end
end
Run Code Online (Sandbox Code Playgroud)

虽然这肯定比直接比较和内联代码慢,但速度在这里基本上是无关紧要的(通常发生的频率远低于每秒约100倍)并且灵活性具有很高的价值.