ฉันกำลังคุยกับเพื่อนเกี่ยวกับโค้ด Ruby และหัวข้อของค่าส่งคืนปรากฏขึ้น…
…และแน่นอน nil
เป็นส่วนหนึ่งของการสนทนานั้นเสมอ
วันนั้นผมกำลังจะเข้านอน กำลังคิดว่า ทำไมเราใช้ nil
?
ฉันคิดว่าจะเป็นความคิดที่ดีที่จะเขียนเกี่ยวกับเรื่องนี้ในวันถัดไป และฉันก็มาถึงแล้ว ฉันหวังว่าคุณจะพบว่าสิ่งนี้น่าสนใจและเรียนรู้สิ่งใหม่!
ผลตอบแทนและพฤติกรรมที่คาดหวัง
เมื่อคุณเรียก method เช่น select
คุณจะได้รับอาร์เรย์เสมอ
ถึงแม้จะไม่มีอะไรให้เลือกก็ตาม
ตัวอย่าง :
[1,2,3].select {} # [] [1,2,3].select(&:even?) # [2]
แต่ทำไมสิ่งนี้ถึงสำคัญ?
เป็นคำถามที่ดี!
หากคุณได้รับอาร์เรย์เสมอ คุณสามารถเรียกใช้เมธอดของอาร์เรย์ได้ (size
, empty?
, push
…) โดยไม่ต้องตรวจสอบว่าคุณกำลังทำงานกับอาร์เรย์จริงหรือไม่ .
นั่นเป็นสิ่งที่ดีเพราะการตรวจสอบคลาสทำให้เกิดการมีเพศสัมพันธ์สูง
หากคุณต้องการเขียนโค้ดที่ยืดหยุ่นมากขึ้น หลีกเลี่ยงการตรวจสอบว่า "นี่คือคลาสอะไร" ให้มากที่สุด
การคืนค่าเดี่ยว
โอเค แต่ถ้าใช้วิธีอย่าง find
ซึ่งคืนค่าเพียงหนึ่งค่า?
หากพบองค์ประกอบก็ใช้งานได้:
[1,2,3].find { |n| n == 2 } # 2
หากไม่มีรายการที่ตรงกัน find
ต้องส่งคืนบางอย่าง มันสามารถคืนค่า false
แต่ถ้าเราคาดว่าจะเรียกวิธีการเกี่ยวกับค่าที่ส่งคืนนี้ เราจะได้รับข้อยกเว้น
ที่นี่ nil
เข้ามาเราใช้เพราะมันเป็นสิ่งที่ใกล้เคียงที่สุดที่เราจะได้รับจาก Null Object ทั่วไป
ตามที่คุณอาจจำได้จากบทความล่าสุดของฉันเกี่ยวกับศูนย์ ฉันได้แสดงให้คุณเห็นว่า nil
เป็นคลาสที่มีเมธอดเช่น to_i
, to_s
&to_a
.
วิธีนี้ช่วยให้คุณใช้วิธีการต่างๆ เช่น Array()
และ String()
เพื่อแปลงวัตถุเป็นประเภทเหล่านี้
ตัวอย่าง :
String(123) # "123" String(nil) # "" Array(nil) # []
สิ่งนี้ยังเกิดขึ้นในการแก้ไขสตริง:
"abc#{nil}dfg"
การแก้ไขสตริงเรียก to_s
เกี่ยวกับผลการประเมินสิ่งที่อยู่ภายในบล็อกการแก้ไข ดังนั้นถ้าคุณมี #{1 + 1}
สิ่งนี้จะแปลงเป็น 2.to_s
.
ตอนนี้ ปัญหา ด้วย nil
มาเมื่อคุณไม่คาดหวัง คุณคิดว่าเป็นวัตถุบางอย่างที่ตอบสนองต่อ foo
แต่มันไม่ใช่ ดังนั้นคุณจะได้รับ NoMethodError
ข้อยกเว้น
ในกรณีนั้น คุณต้องการใช้รูปแบบ Null Object ตามที่ผมอธิบายในบทความนี้ โซลูชันอื่นๆ รวมถึงการใช้ fetch
เมธอดที่มีค่าเริ่มต้น &ทำให้เกิดข้อยกเว้นเมื่อค่าเริ่มต้นไม่สมเหตุสมผล
สรุป
คุณได้เรียนรู้แล้วว่าทำไมเราจึงใช้ nil
วิธีหลีกเลี่ยงข้อยกเว้นที่มาจากวิธีการเรียกใน nil
คุณค่าและวิธีเขียนโค้ดให้มั่นใจยิ่งขึ้น
ดูรหัสของคุณ &ดูว่าคุณสามารถระบุรหัสตรวจสอบประเภทได้หรือไม่ (is_a?
/ kind_of?
/ ===
). คุณจะปรับปรุงโค้ดนั้นโดยใช้สิ่งที่คุณเรียนรู้วันนี้ได้อย่างไร