Ternary Operator ใน Ruby คืออะไร?
Ternary operator ประกอบด้วย 3 ส่วน — นั่นที่มาของคำว่า "Ternary" ส่วนเหล่านี้คือ เงื่อนไข (conditional statement) และ ผลลัพธ์ที่เป็นไปได้ 2 แบบ
พูดง่ายๆ คือ Ternary ให้คุณเขียน if/else แบบกระชับในบรรทัดเดียวได้
ตัวอย่าง:
if apple_stock > 1 :eat_apple else :buy_apple end
กลายเป็นแบบนี้ได้:
apple_stock > 1 ? :eat_apple : :buy_apple
ขอขอบคุณ Ternary Operator!
คำถาม... มันทำงานยังไงพอดี และ Syntax ถูกต้องคือแบบไหน?
มาหาลองดูกัน
เทมเพลตสำหรับเขียน Ternary เอง
ถ้าทั่วไป Syntax ของ Ternary operator จะได้ "เทมเพลต填空" แบบนี้:
長這樣:
condition ? true : false
ส่วนแรกคือ เงื่อนไข (condition) — สิ่งที่คุณต้องการตรวจสอบว่าเป็นจริงหรือไม่
ตามด้วยเครื่องหมายคำถาม (?) — เป็นส่วนหนึ่งของ Syntax บอก Ruby ว่าคุณกำลังเขียน Ternary
ต่อมา:
โค้ดที่อยากรันถ้าเงื่อนไขเป็น true — ผลลัพธ์แรก
ตามด้วยทวิภาค (:) — อีก Syntax element
สุดท้าย โค้ดที่อยากรันถ้าเงื่อนไขเป็น false — ผลลัพธ์ที่สอง
ตัวอย่าง:
"chocolate".size > 4 ? "More than four characters" : "Less than four characters"
- Condition =>
"chocolate".size > 4 - If True =>
"More than four characters" - Else =>
"Less than four characters"
สามส่วนนี้คือองค์ประกอบของทุก Ternary expression
อย่าลืม ? ระหว่างเงื่อนไขและผลลัพธ์ แม้ชื่อเมธอดจะลงท้ายด้วยเครื่องหมายคำถาม
ตัวอย่าง:
"".empty? ? "Yes" : "No"
จุดนี้มักพลาดง่าย ให้ระวังตอนเขียน
Complex Ternary Operators (Ternary ที่ซับซ้อน)
Ternary operator ใช้ผิดได้
เริ่มเป็นไอเดียไม่ดีเมื่อคุณอยากทำอะไรซับซ้อนด้วยมัน
ตัวอย่าง:
คุณ Assign ผลลัพธ์ของ Ternary ใส่ตัวแปรได้
a = 10 > 5 ? "yes" : "no"
แบบนี้โอเค
แต่มันซับซ้อนขึ้นตอนผลลัพธ์มี Space อยู่ข้างใน
เช่นนี้:
10 > 5 ? (puts "yes") : (puts "no")
ต้องใช้วงเล็บครอบ
ทำไม?
ถ้าไม่ใส่ จะได้ SyntaxError
วงเล็บเหล่านี้ทำให้โค้ดอ่านยากขึ้น สูญเสียประโยชน์ของ Ternary ด้าน Readability และ Style
จดจำไว้ตอนตัดสินใจว่าจะใช้ Ternary หรือไม่
Ternary Operators & Operator Precedence (ลำดับความสำคัญของโอเปอเรเตอร์)
อีกปัญหาหนึ่งคือ Operator Precedence
ตัวอย่าง:
[].tap { |a| a << "ccccc".size == 0 ? "empty" : "not empty" } # [5]
คาดหวัง "empty" หรือ "not empty" แต่ได้ 5 แทน
เกิดอะไรขึ้น?
Ruby (และภาษาอื่นๆ) ประมวลผล Expression ด้วยระดับ Priority ต่างกัน
มันเกิดขึ้นแม้ในคณิตศาสตร์พื้นฐาน!
คูณหารทำก่อน บวกลบทำทีหลัง
เช่นกันใน Ruby การเรียกเมธอด (<< และ size) มี Precedence สูงกว่า Ternary operator — อธิบายพฤติกรรมตัวอย่างข้างต้น
แก้ได้ด้วยวงเล็บ:
[].tap { |a| a << ("bbbbb".size == 0 ? "empty" : "not empty") } # ["not empty"]
อีกอย่างต้องระวังตอนเขียน Ternary!
Video Tutorial
Summary (สรุป)
คุณเรียนรู้ Ternary conditional operator ใน Ruby แล้ว — ออเปอเรเตอร์นี้เขียนเงื่อนไขแบบกระชับได้ อาจทำให้โค้ดอ่านง่ายหรือยากขึ้นอยู่กับสถานการณ์
ตอนนี้ถึงคุณแล้ว! ฝึกฝนสิ่งที่เรียนรู้ให้จดจำในสมอง
ขอบคุณที่อ่าน 🙂