Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เชี่ยวชาญ Ternary Operator ใน Ruby: คู่มือสร้างเงื่อนไขแบบกระชับ

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 แล้ว — ออเปอเรเตอร์นี้เขียนเงื่อนไขแบบกระชับได้ อาจทำให้โค้ดอ่านง่ายหรือยากขึ้นอยู่กับสถานการณ์

ตอนนี้ถึงคุณแล้ว! ฝึกฝนสิ่งที่เรียนรู้ให้จดจำในสมอง

ขอบคุณที่อ่าน 🙂