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

ทำไมเราใช้ Nil?

ฉันกำลังคุยกับเพื่อนเกี่ยวกับโค้ด 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? / === ). คุณจะปรับปรุงโค้ดนั้นโดยใช้สิ่งที่คุณเรียนรู้วันนี้ได้อย่างไร