确定变量是否是Lua中的几个值之一

时间:2016-10-14 05:55:04

标签: lua readability

我有一个值func findHeightForText(text: String, havingWidth widthValue: CGFloat, andFont font: UIFont) -> CGSize { var size = CGSize.zero if text.isEmpty == false { let frame = text.boundingRect(with: CGSize(width: widthValue, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) size = CGSize(width: frame.size.width, height: ceil(frame.size.height))//CGSizeMake(frame.size.width, ceil(frame.size.height)) } return size } ,需要一个函数来检查它是否是8个值中的一个。由于我对Lua很陌生,我正在寻找做这种检查的最佳方法。

这有效:

armyName

这也有效:

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

与这个PHP代码相比,它们都相当愚蠢:

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

有没有比提供的Lua代码片段更好的方法来进行这样的检查?如果没有,典型的Lua程序员会更喜欢遇到什么;第一个还是第二个?

我正在使用Lua 5.0。

3 个答案:

答案 0 :(得分:4)

你也可以这样做:

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

此实现可能比您的第二个选项慢一点,因为您的第二个选项使用键。你的第二个选择也不错,甚至可能是最快的。它确实看起来很傻,但它很容易配置。

如果表格不是必需的,你也可以使用模式匹配,并坚持使用该军队命名惯例:

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

你甚至可以删除~= nil,因为它会返回一个字符串,在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而不是任何其他语言。

答案 1 :(得分:2)

function in_dictionary(val,dict)
    return dict[val]
end

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

可能是最好的方法。

答案 2 :(得分: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