118

无论如何在Lua中使用内联条件?

如:

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

4 回答 4

161

当然:

print("blah: " .. (a and "blah" or "nahblah"))
于 2011-04-02T20:59:39.287 回答
40

如果这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))
于 2011-04-03T12:29:48.237 回答
1

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

添加这个:

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'
于 2021-04-01T10:01:50.940 回答
0

玩得开心 :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
于 2022-02-03T10:17:57.253 回答