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"))

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"))

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))

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.