无论如何在Lua中使用内联条件?
如:
print("blah: " .. (a == true ? "blah" : "nahblah"))
当然:
print("blah: " .. (a and "blah" or "nahblah"))
如果这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))
尽管这个问题相当古老,但我认为建议另一种在语法上看起来与三元运算符非常相似的替代方案是公平的。
添加这个:
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'
玩得开心 :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