nil เป็นหัวข้อที่พบเจอบ่อยใน Ruby ทำไมเราจึงใช้ nil? มาดูกัน
On Return Values & Expected Behavior (ค่าที่คืนและพฤติกรรมที่คาดหวัง)
เมธอดเช่น select คืนค่า Array เสมอ แม้ไม่มีข้อมูลที่ match:
[1,2,3].select {} # []
[1,2,3].select(&:even?) # [2]
สำคัญเพราะเรียก array methods (size, empty?, push) ได้เลย โดยไม่ต้องเช็คว่าเป็น Array จริงๆ ลด coupling จากการตรวจสอบ class
Returning Single Values (การคืนค่าเดี่ยว)
เมธอด find คืนค่าเดี่ยว ถ้าเจอทำงานปกติ แต่ถ้าไม่เจอต้องคืนอะไรสักอย่าง false จะทำให้ error ถ้าเรียกเมธอดต่อ nil จึงเป็น Null Object pattern ที่ใกล้เคียงที่สุด
nil มีเมธอด to_i, to_s, to_a ทำให้ใช้ Array(), String() แปลงได้:
String(123) # "123" String(nil) # "" Array(nil) # []
String interpolation เรียก to_s อัตโนมัติ ปัญหาของ nil เกิด เมื่อไม่คาดคิด คิดว่ามีเมธอด foo แต่จริงๆ เป็น nil → NoMethodError แก้ด้วย Null Object pattern, fetch กับค่าเริ่มต้น, หรือ raise exception
Summary
เรียนรู้ทำไมใช้ nil, หลีกเลี่ยง exception จากการเรียกเมธอดบน nil, เขียนโค้ดมั่นใจขึ้น ลองตรวจสอบโค้ดดูว่ามี type-checking (is_a?, kind_of?, ===) ที่ปรับปรุงได้ไหม