Lua 中的内联条件(a == b ?“是”:“否”)?

Posted

技术标签:

【中文标题】Lua 中的内联条件(a == b ?“是”:“否”)?【英文标题】:Inline conditions in Lua (a == b ? "yes" : "no")? 【发布时间】:2011-07-28 09:41:15 【问题描述】:

在 Lua 中是否可以使用内联条件?

如:

print("blah: " .. (a == true ? "blah" : "nahblah"))

【问题讨论】:

lua-users wiki上有一篇不错的关于三元运算符的文章,附有问题解释和几个解决方案。 【参考方案1】:

当然:

print("blah: " .. (a and "blah" or "nahblah"))

【讨论】:

+1 为答案。但是,我认为这并不完全正确——我不使用 LUA——但我认为与其他语言的三元运算符相比,它与这种方法有一个“缺陷”。想象一下:(cond and false-value or x) 在所有情况下都会导致x 那不是也打印 A 的值吗? @glowcoder 否。“如果此值为 false 或 nil,则合取运算符 (and) 返回其第一个参数;否则,返回其第二个参数。析取运算符 (or) 返回其第一个参数,如果此值不同于 nil 和 false;否则,或返回其第二个参数。and 和 or 都使用快捷评估,即仅在必要时评估第二个操作数" -- 来自lua.org/manual/5.0/manual.html @pst 是正确的,如果意图是 a and false or true 不会给出与 not a 相同的答案。此成语通常用于a 为真时所需值不能为falsenil 的情况。 如果你在这个表单中使用变量,你可能会假设第二个变量是非假的,这意味着你应该写a and assert(b) or c【参考方案2】:

如果a and t or f 不适合您,您可以随时创建一个函数:

function ternary ( cond , T , F )
    if cond then return T else return F end
end

print("blah: " .. ternary(a == true ,"blah" ,"nahblah"))

当然,那么你的缺点是 T 和 F 总是被评估...... 要解决您需要为三元函数提供函数的问题,这可能会变得笨拙:

function ternary ( cond , T , F , ...)
    if cond then return T(...) else return F(...) end
end

print("blah: " .. ternary(a == true ,function() return "blah" end ,function() return "nahblah" end))

【讨论】:

我认为这对布尔变量最有用 这个答案实际上比最佳答案更好,因为它也适用于布尔值。 我认为这个解决方案更常见的边缘情况是tnil【参考方案3】:

虽然这个问题相当古老,但我认为建议另一种在语法上看起来与三元运算符非常相似的替代方案是公平的。

添加这个:

function register(...)
    local args = ...
    for i = 1, select('#', ...) do
        debug.setmetatable(args[i], 
            __call = function(condition, valueOnTrue, valueOnFalse)
                if condition then
                    return valueOnTrue
                else
                    return valueOnFalse
                end
            end
        )
    end
end

-- Register the required types (nil, boolean, number, string)
register(nil, true, 0, '')

然后像这样使用它:

print((true)  (false, true)) -- Prints 'false'
print((false) (false, true)) -- Prints 'true'
print((nil)   (true, false)) -- Prints 'false'
print((0)     (true, false)) -- Prints 'true'
print(('')    (true, false)) -- Prints 'true'

注意: 但是,对于表格,您不能通过上述方法直接使用它们。这是因为每个表都有自己独立的元表,Lua 不允许您一次修改所有表。

在我们的例子中,一个简单的解决方案是使用 not not 技巧将表格转换为布尔值:

print((not not ) (true, false)) -- Prints 'true'

【讨论】:

【参考方案4】:

玩得开心 :D

local n = 12
do
    local x = (n>15)
            and print(">15")
            or n>13
            and print(">13")
            or n>5
            and print(">5")
end

【讨论】:

以上是关于Lua 中的内联条件(a == b ?“是”:“否”)?的主要内容,如果未能解决你的问题,请参考以下文章

lua中的赋值

lua中的逻辑运算符

Lua里有没有逻辑运算 中的并和或的运算

字符串 [] 数组中的 C# 内联条件

Lua 运算符

带有条件禁用控件的内联编辑