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

Sof*_*nux 73 lua conditional ternary

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

如:

print("blah: " .. (a == true ? "blah" : "nahblah"))
Run Code Online (Sandbox Code Playgroud)

Joh*_*nck 102

当然:

print("blah: " .. (a and "blah" or "nahblah"))
Run Code Online (Sandbox Code Playgroud)

  • 答案为+1.但是我不认为这是完全正确的 - 我不使用LUA - 但我认为它与其他语言的三元运算符有这种方法的"缺陷".想象一下:`(cond和false-value或x)`这将导致所有情况下的`x`. (27认同)
  • @glowcoder否"如果此值为false或nil,则连接运算符(和)返回其第一个参数;否则返回其第二个参数.如果此值与nil和false不同,则析取运算符(或)返回其第一个参数;否则,或者返回它的第二个参数.和/和或使用快捷评估,也就是说,仅在必要时评估第二个操作数" - 来自http://www.lua.org/manual/5.0/manual. HTML (10认同)
  • @pst是正确的,如果意图是'a和false或true`不会给出与'not a'相同的答案.这个习惯用法通常用于"a"为真的期望值不能为"false"或"nil"的情况. (3认同)
  • 如果您将此形式与变量一起使用,您可能会假设第二个变量是非假的,这意味着您应该编写“a 和assert(b) 或c”。 (2认同)

dau*_*tor 22

如果这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"))
Run Code Online (Sandbox Code Playgroud)

当然,那么你有一个回顾,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))
Run Code Online (Sandbox Code Playgroud)


小智 17

你通常可以这样做:

condition and ifTrue or ifFalse
Run Code Online (Sandbox Code Playgroud)

但这不一定是最好的方法。主要原因是因为如果ifTrue是一个假值(有时),即使是一个真值ifFalse也会评估。condition无需太多额外工作即可简单完成此操作的一种方法是:

(condition and {ifTrue} or {ifFalse})[1]
Run Code Online (Sandbox Code Playgroud)

它的优点是不仅是一个表达式并且不会受到ifTrue虚假问题的影响,这意味着它可以处理所有情况,而且还具有短路的优点(不评估其他表达式)。不需要额外的功能或搞乱 Lua 的复杂方面。