【问题标题】:Lua: Do I need to repeat variable in if?Lua:我需要在 if 中重复变量吗?
【发布时间】:2022-01-27 02:41:51
【问题描述】:

当我说 if var == "one" or var == "two" or var == "three" or var == "four" then var 总是一样的,我可以以某种方式缩短它,比如 if var == "one" or "two" or "three" or"four" then

我必须使用括号吗?

【问题讨论】:

    标签: lua


    【解决方案1】:

    我们可以利用桌子。特别是,如果some_table包含some_key,那么some_table[some_key]返回nil,这是假的。

    例如:

    if ({one=1, two=1, three=1, four=1})[var] then
    

    我使用了1,因为它的类型很短,但是您可以使用除nilfalse 之外的任何值,因为这两个是Lua 中唯一的虚假值。

    这会在每次评估条件时创建一个新表,因此如果您想经常检查它(例如在一个紧密的循环中),那么在外部创建表可能是值得的循环:

    local CONDITION = {one=1, two=1, three=1, four=1}
    ...
       -- inside a loop:
       if CONDITION[var] then
    

    【讨论】:

    • 谢谢。那非常有帮助。不幸的是,由于我缺乏声誉,我的赞成票尚未计算在内。
    【解决方案2】:

    Lua 的 if 语句需要一个奇异值。该值将转换为布尔值 truefalse 确定 if 行为的值。

    所以,换句话说,你可以想象你的if是这样的:

    condition = var == "one" or var == "two" or var == "three" or var == "four"
    if condition then
        --...
    end
    

    所以if 本身并不能帮助我们处理重复,但是知道它期望什么,很容易创建一个辅助函数。我们可以让它接受一个值和一个值列表,将其与值进行比较,如果有任何匹配项,则返回 true。顺便说一句,这与检查列表是否包含特定元素 which is easier to search for 相同。

    所以,给定这样一个简单的助手:

    function contains(t, x)
        for _, v in ipairs(t) do
            if v == x then
                return true
            end
        end
    
        return false
    end
    

    我们可以这样写你的if

    if contains({"one", "two", "three", "four"}, var) then
        --...
    end
    

    【讨论】:

    • 谢谢。这很有帮助。不幸的是,由于我缺乏声誉,我的赞成票尚未计算在内。
    • 我工作的环境甚至似乎在较低模块的某处有一个“包含”功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2018-11-08
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多