确定变量是否是 Lua 中的几个值之一
Determine if variable is one of several values in 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.
function in_array(v, t)
for i=1,#t do
if v == t[i] then return true end
end
end
if in_array(v, {....}) then .... end
你也可以这样做:
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 -- We could ommit this part, as nil is like 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
此实现可能比您的第二个选项慢一点,因为您的第二个选项使用键。你的第二个选择不错,它甚至可能是最快的。它看起来确实很傻,但是很容易配置。
您也可以使用模式匹配,如果 table 不是必需的并且会坚持军队命名约定:
local function isPlayerArmyName(armyName)
return (string.match(armyName, "^ARMY_[1-8]$")) ~= nil
end
您甚至可以删除 ~= nil
,因为它会 return 一个字符串,在 Lua 中也是如此:
local function isPlayerArmyName(armyName)
return string.match(armyName, "^ARMY_[1-8]$")
end
if isPlayerArmyName("ARMY_1") then
-- This will be executed, since it returned "ARMY_1", which evaluates to true
end
if isPlayerArmyName("ARMY_9") then
-- This will not be executed, since the function returned nil.
end
至于您提供的第一个示例,我不建议这样做,因为它不是模块化的或可扩展的,不在 Lua 中,也不在任何其他语言中。
function in_dictionary(val,dict)
return dict[val]
end
print(in_dictionary("potatoes", {apples = true, potatoes = true, oranges = true}))
可能是最好的方法。
我有一个值 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.
function in_array(v, t)
for i=1,#t do
if v == t[i] then return true end
end
end
if in_array(v, {....}) then .... end
你也可以这样做:
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 -- We could ommit this part, as nil is like 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
此实现可能比您的第二个选项慢一点,因为您的第二个选项使用键。你的第二个选择不错,它甚至可能是最快的。它看起来确实很傻,但是很容易配置。
您也可以使用模式匹配,如果 table 不是必需的并且会坚持军队命名约定:
local function isPlayerArmyName(armyName)
return (string.match(armyName, "^ARMY_[1-8]$")) ~= nil
end
您甚至可以删除 ~= nil
,因为它会 return 一个字符串,在 Lua 中也是如此:
local function isPlayerArmyName(armyName)
return string.match(armyName, "^ARMY_[1-8]$")
end
if isPlayerArmyName("ARMY_1") then
-- This will be executed, since it returned "ARMY_1", which evaluates to true
end
if isPlayerArmyName("ARMY_9") then
-- This will not be executed, since the function returned nil.
end
至于您提供的第一个示例,我不建议这样做,因为它不是模块化的或可扩展的,不在 Lua 中,也不在任何其他语言中。
function in_dictionary(val,dict)
return dict[val]
end
print(in_dictionary("potatoes", {apples = true, potatoes = true, oranges = true}))
可能是最好的方法。