Lua中判断变量是否为多个值之一

我有一个值armyName,需要一个函数来检查它是否为8个值中的一个。由于我对Lua相当陌生,我正在寻找执行此类检查的最佳方法。

这段代码可以工作:

local function isPlayerArmyName(armyName)
    return armyName == "ARMY_1"
        or armyName == "ARMY_2"
        or armyName == "ARMY_3"
        or armyName == "ARMY_4"
        or armyName == "ARMY_5"
        or armyName == "ARMY_6"
        or armyName == "ARMY_7"
        or armyName == "ARMY_8"
end

这个也可以工作:

local function isPlayerArmyName(armyName)
    local names = {
        ["ARMY_1"] = true,  ["ARMY_2"] = true, ["ARMY_3"] = true, ["ARMY_4"] = true,
        ["ARMY_5"] = true,  ["ARMY_6"] = true, ["ARMY_7"] = true, ["ARMY_8"] = true,
    }

    return names[armyName] or false
end

与此PHP代码相比,它们都相当傻:

return in_array( $armyName, [ "ARMY_1", "ARMY_2", "ARMY_3", ..., "ARMY_8" ] )

有没有更好的方法来执行此类检查,比提供的Lua代码片段更好?如果没有,标准的Lua程序员会更喜欢哪一个方法?

我正在使用Lua 5.0。

点赞
用户2328287
用户2328287
# 函数定义:在给定的数组中查找指定的值是否存在
function in_array(v, t)
  for i=1,#t do
    if v == t[i] then return true end
  end
end

# 使用示例:如果指定数组中包含值v,则执行某些操作
if in_array(v, {....}) then .... end
2016-10-14 06:06:32
用户1381216
用户1381216

你也可以这样做:

local names = {"ARMY_1", "ARMY_2", "ARMY_3", "ARMY_4", "ARMY_5", "ARMY_6", "ARMY_7", "ARMY_8"}

local function isPlayerArmyName(armyName)
    for index = 1, #names do
        if names[index] == armyName then
            return true
        end
    end
end

这个选项是可扩展的,因为你可以在需要更改实现的情况下添加新的军队。你可以将 for 部分提取到你自己的 in_array 函数中,可以在所有代码中使用:

local function in_array(value, array)
    for index = 1, #array do
        if array[index] == value then
            return true
        end
    end

    return false -- 我们可以省略这部分,因为 nil 就像 false 一样
end

local armyNames = {"ARMY_1", "ARMY_2", "ARMY_3", "ARMY_4", "ARMY_5", "ARMY_6", "ARMY_7", "ARMY_8"}

local function isPlayerArmyName(armyName)
    return in_array(armyName, armyNames)
end

由于第二个选项使用键,所以这个实现可能会比第二个选项慢一些。第二个选项也不错,甚至可能是最快的。它看起来很愚蠢,但很容易配置。

您还可以使用模式匹配,如果不需要表格并将坚持该军队命名约定:

local function isPlayerArmyName(armyName)
    return (string.match(armyName, "^ARMY_[1-8]$")) ~= nil
end

您甚至可以删除 ~= nil,因为它将返回一个字符串,在Lua中也为true:

local function isPlayerArmyName(armyName)
    return string.match(armyName, "^ARMY_[1-8]$")
end

if isPlayerArmyName("ARMY_1") then
    -- 这将被执行,因为它返回了 "ARMY_1" ,它会被计算为 true
end

if isPlayerArmyName("ARMY_9") then
    -- 这将不会被执行,因为该函数返回了 nil。
end

至于你提供的第一个例子,我不建议这样做,因为它在 Lua 中或其他任何语言中都不是模块化或可扩展的。

2016-10-14 06:33:37
用户3979429
用户3979429
函数 in_dictionary(val, dict)
    返回 dict[val]
结束

打印(in_dictionary("potatoes", {apples = true, potatoes = true, oranges = true}))

可能是实现它的最佳方式。

2016-10-14 09:52:04