เงื่อนไขแบบอินไลน์ใน Lua (a == b?“ yes”:“ no”)?


95

มีการใช้เงื่อนไขแบบอินไลน์ใน Lua หรือไม่?

เช่น:

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

1
มีบทความดีๆเกี่ยวกับlua-users wikiเกี่ยวกับตัวดำเนินการ ternary พร้อมกับคำอธิบายปัญหาและวิธีแก้ปัญหาต่างๆ
Marcin

คำตอบ:


126

แน่นอน:

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

32
+1 สำหรับคำตอบ อย่างไรก็ตามฉันไม่คิดว่านี่เป็นความจริงอย่างเคร่งครัด - ฉันไม่ได้ใช้ LUA - แต่ฉันคิดว่ามันมี "ข้อบกพร่อง" ร่วมกับวิธีนี้มากกว่าตัวดำเนินการที่เกี่ยวข้องในภาษาอื่น ลองนึกภาพ: (cond and false-value or x)นั่นจะส่งผลxในทุกกรณี

1
มันจะไม่พิมพ์ค่าของ A ด้วยหรือ?
corsiKa

11
@glowcoder No. "ตัวดำเนินการร่วม (และ) ส่งคืนอาร์กิวเมนต์แรกหากค่านี้เป็นเท็จหรือไม่มีมิฉะนั้นจะส่งกลับอาร์กิวเมนต์ที่สองตัวดำเนินการแยกส่วน (หรือ) ส่งคืนอาร์กิวเมนต์แรกหากค่านี้แตกต่างจากศูนย์และเท็จ ; มิฉะนั้นหรือส่งกลับอาร์กิวเมนต์ที่สองทั้งและและหรือใช้การประเมินผลทางลัดนั่นคือตัวถูกดำเนินการที่สองจะได้รับการประเมินในกรณีที่จำเป็นเท่านั้น "- จากlua.org/manual/5.0/manual.html

3
@pst ถูกต้องว่าถ้าเจตนาเป็นอย่างนั้นa and false or trueจะไม่ให้คำตอบเดียวกับnot a. สำนวนนี้มักจะใช้สำหรับกรณีที่ค่าที่ต้องการถ้าaเป็นจริงไม่สามารถหรือfalse nil
RBerteig

1
a and assert(b) or cหากคุณกำลังใช้รูปแบบนี้กับตัวแปรที่คุณอาจคิดว่าตัวแปรที่สองคือไม่ใช่เท็จซึ่งหมายความว่าคุณควรจะเขียน
HoverHell

31

หาก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 ได้รับการประเมินเสมอ .... ในการหลีกเลี่ยงสิ่งที่คุณต้องจัดเตรียมฟังก์ชันให้กับฟังก์ชัน ternary ของคุณและอาจทำให้เกิดความไม่สะดวก:

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

ฉันคิดว่านี่เป็นประโยชน์ที่สุดสำหรับตัวแปรบูลีน
Vyacheslav

1
คำตอบนี้ดีกว่าคำตอบด้านบนเนื่องจากใช้ได้กับบูลีนเช่นกัน
ДеянДобромиров

ผมคิดว่าเป็นกรณีขอบร่วมกันมากขึ้นว่าการแก้ปัญหานี้รองรับคือเมื่อเป็นt nil
NetherGranite
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.