Kondisi sebaris di Lua (a == b? “Yes”: “no”)?

95

Apakah ada cara untuk menggunakan kondisi sebaris di Lua?

Seperti:

print("blah: " .. (a == true ? "blah" : "nahblah"))
Softnux
sumber
1
Ada artikel bagus di wiki lua-users tentang operator terner, bersama dengan penjelasan masalah dan beberapa solusi.
Marcin

Jawaban:

126

Tentu:

print("blah: " .. (a and "blah" or "nahblah"))
John Zwinck
sumber
32
1 untuk jawabannya. Namun menurut saya ini tidak sepenuhnya benar - saya tidak menggunakan LUA - tetapi saya pikir ini memiliki "cacat" yang sama dengan pendekatan ini melalui operator terner dalam bahasa lain. Bayangkan: (cond and false-value or x)Itu akan menghasilkan xsemua kasus.
1
bukankah itu juga akan mencetak nilai A juga?
corsiKa
11
@glowcoder No. "Operator konjungsi (dan) mengembalikan argumen pertamanya jika nilai ini salah atau nil; sebaliknya, dan mengembalikan argumen keduanya. Operator disjungsi (atau) mengembalikan argumen pertamanya jika nilai ini berbeda dari nil dan salah ; jika tidak, atau mengembalikan argumen keduanya. Keduanya dan dan atau menggunakan evaluasi pintasan
3
@pst benar bahwa jika maksudnya itu a and false or truetidak akan memberikan jawaban yang sama seperti not a. Idiom ini biasanya digunakan untuk kasus-kasus di mana nilai yang diinginkan jika abenar tidak dapat falseatau nil.
RBerteig
1
Jika Anda menggunakan formulir ini dengan variabel, Anda mungkin berasumsi bahwa variabel kedua tidak salah, yang berarti Anda harus menulis a and assert(b) or c.
HoverHell
31

Jika a and t or ftidak berhasil, Anda selalu dapat membuat fungsi:

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

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

tentu saja, maka Anda memiliki kekurangan bahwa T dan F selalu dievaluasi .... untuk menyiasati bahwa Anda perlu menyediakan fungsi ke fungsi terner Anda, dan itu bisa menjadi sulit:

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))
daurnimator
sumber
Saya pikir ini adalah yang paling berguna untuk variabel boolean
Vyacheslav
1
Jawaban ini sebenarnya lebih baik daripada jawaban teratas karena berfungsi juga untuk boolean.
Деян Добромиров
Saya pikir kasus tepi yang lebih umum bahwa solusi ini menampung adalah ketika tadalah nil.
NetherGranite