Lua'da satır içi koşullar (a == b? "Evet": "hayır")?


95

Lua'da satır içi koşulları kullanmanın bir yolu var mı?

Gibi:

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

1
Üçlü operatör hakkında lua-users wiki hakkında, problem açıklaması ve çeşitli çözümlerle birlikte güzel bir makale var .
Marcin

Yanıtlar:


126

Elbette:

print("blah: " .. (a and "blah" or "nahblah"))

32
Cevap için +1. Bununla birlikte, bunun kesinlikle doğru olduğunu düşünmüyorum - LUA kullanmıyorum - ancak bu yaklaşımla diğer dillerdeki üçlü operatöre göre bir "kusur" paylaştığını düşünüyorum. Düşünün: (cond and false-value or x)Bu xher durumda sonuçlanacaktır .

1
bu aynı zamanda A'nın değerini de yazdırmaz mı?
corsiKa

11
@glowcoder No. "Bağlaç operatörü (ve), bu değer yanlış veya nil ise ilk argümanını döndürür; aksi takdirde, ikinci argümanını döndürür. Ayrılma operatörü (veya), bu değer nil'den farklıysa ve yanlışsa ilk argümanını verir ; aksi takdirde veya ikinci argümanını döndürür. Hem ve hem de kısayol değerlendirmesini kullanın, yani ikinci işlenen yalnızca gerekirse değerlendirilir "- lua.org/manual/5.0/manual.html'den

3
@pst, eğer niyet buysa, a and false or trueile aynı cevabı vermeyeceği doğrudur not a. Bu deyim, genellikle eğer arzu değer durumlar için kullanılır adoğrudur olamaz falseya nil.
RBerteig

1
Bu formu değişkenlerle kullanıyorsanız, muhtemelen ikinci değişkenin yanlış olmadığını varsayarsınız, bu da yazmanız gerektiği anlamına gelir a and assert(b) or c.
HoverHell

30

Eğer a and t or fsizin için çalışmaz, her zaman sadece bir işlev oluşturabilirsiniz:

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

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

Tabii ki, o zaman T ve F'nin her zaman değerlendirildiği dezavantajınız var .... Üç basamaklı fonksiyonunuza işlevler sağlamanız gerektiğini ve bu zorlaşabilir:

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

Bunun boole değişkenleri için en kullanışlı olduğunu düşünüyorum
Vyacheslav

1
Bu cevap aslında en iyi cevaptan daha iyidir çünkü aynı zamanda boole'lar için de işe yarar.
Деян Добромиров

Bence bu çözümün barındırdığı daha yaygın bir uç durum, ne zaman tolduğu nil.
NetherGranite
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.