ไม่มี…
มันคืออะไร?
ก็ nil
เป็นวัตถุ Ruby พิเศษที่ใช้แทนค่า "ว่าง" หรือ "ค่าเริ่มต้น" นอกจากนี้ยังเป็นค่า "เท็จ" ซึ่งหมายความว่ามีพฤติกรรมเหมือน false
เมื่อใช้ในประโยคเงื่อนไข
ตอนนี้ :
มีเพียงหนึ่ง nil
วัตถุที่มี object_id
จาก 4
(หรือ 8
ใน Ruby 64 บิต) นี่เป็นส่วนหนึ่งของสาเหตุที่ nil
เป็นพิเศษ
nil.object_id # 4
มาเจาะลึกกัน!
ค่า Nil มาจากไหน
หลายวิธีสามารถคืนค่า nil
ส่งผลให้
สิ่งนี้จะเกิดขึ้นเมื่อคุณขอค่าแต่ไม่มีค่านั้น
ตัวอย่าง :
- ไม่พบสินค้า
- ดัชนีอาร์เรย์อยู่นอกขอบเขต
- ไม่มีคีย์แฮช
นี่คือโค้ดบางส่วนเพื่อสาธิตสิ่งนี้ :
arr = [1,2,3] arr[5] # nil
ซึ่งมักจะนำไปสู่ปัญหาทุกประเภท เนื่องจากเราคาดว่าวิธีการที่เราเรียกจะคืนค่าที่ถูกต้องแทนที่จะเป็น nil
.
ชอบสิ่งนี้ NoMethodError
ข้อยกเว้น:
arr[5].size # NoMethodError: undefined method 'size' for nil:NilClass
เพื่อหลีกเลี่ยงข้อผิดพลาดนี้ คุณจะต้องตรวจสอบว่าคุณมี nil
ค่าก่อนที่คุณจะเรียกใช้วิธีการนั้น
ทดสอบหา Nil In Ruby
หากคุณไม่ต้องการได้รับข้อผิดพลาด “undefined method for nil:NilClass” ลองสิ่งนี้…
เฉพาะวิธีการโทรถ้าไม่มี :
if array[5] && array[5].size # do something... end
นี่คือเหตุผลที่ Ruby 2.3 แนะนำตัวดำเนินการ “safe navigator” (&.
)
ตัวอย่าง :
if arr[5]&.size # do something... end
อีกวิธีในการทดสอบหา nil คือการใช้ nil?
วิธีการ:
if @bacon.nil? # ... end
อีกทางเลือกหนึ่งคือการใช้ blank?
วิธีการ (รางเท่านั้น)
คุณสามารถใช้เทคนิคบางอย่างเพื่อหลีกเลี่ยงการตรวจสอบ nil
ทั้งนี้ขึ้นอยู่กับวัตถุที่คุณกำลังใช้งาน ค่าทั้งหมด
ตัวอย่างเช่น คุณสามารถใช้ fetch
เมธอดบนวัตถุ Hash &Array
หรือคุณสามารถใช้ "Null Object Pattern" ในคลาสของคุณเองได้หากต้องการคืนค่าดีฟอลต์แทน nil
.
สถานที่อื่นๆ ที่ Nil ซุ่มซ่อนอยู่
คุณควรระวังว่าตัวแปรอินสแตนซ์ที่ไม่ได้กำหนดจะคืนค่า nil
.
@foo # nil
ระวังให้ดี มันอาจจะเกิดขึ้นได้ว่าคุณสะกดชื่อตัวแปรอินสแตนซ์ของคุณผิด หรือคุณลืมเริ่มต้นมัน!
ที่อื่นที่คุณสามารถหา nil
อยู่กับ puts
&print
วิธีการ
สองวิธีนี้จะคืนค่า nil
. เสมอ .
ฉันพูดถึงเรื่องนี้เพราะเคยเห็นนักเรียนบางคนลองทำสิ่งนี้:
numbers = [1,2,3].map { |n| puts n * 2 }
ซึ่งส่งผลให้ numbers
เป็น [nil, nil, nil]
. วิธีแก้ไขในกรณีนี้คือเพียงแค่ลบ puts
จากภายในบล็อก
ทำความเข้าใจ NilClass
เช่นเดียวกับวัตถุ Ruby อื่น ๆ nil
มีชุดวิธีการ
นี่คือคำจำกัดความของคลาสจาก Rubinius:
class NilClass def to_s "" end def inspect "nil" end def nil? true end def to_a [] end def to_f 0.0 end def to_i 0 end def to_c Complex(0) end def to_h {} end end
สังเกตว่า to_something
. ทั้งหมดเหล่านี้เป็นอย่างไร วิธีการคืนค่าว่าง (0
สำหรับตัวเลข)
แฮชว่าง สตริงว่าง อาร์เรย์ว่าง…
เหตุผลก็คือ nil
ใช้เพื่อแสดงถึง “ไม่มีอะไร”
รูปแบบวัตถุว่าง
ไม่มีการสนทนาเกี่ยวกับ nil
เสร็จสมบูรณ์โดยไม่ต้องกล่าวถึงรูปแบบวัตถุว่าง
ในการบรรยายที่ยอดเยี่ยมของเธอ “Nothing is Something” แซนดี้ เมตซ์ชี้ให้เห็นว่าในขณะที่ nil
หมายถึง "ไม่มีอะไร" ซึ่งสามารถมีความหมายเฉพาะเจาะจงมากขึ้นได้
ตัวอย่างเช่น หากเราเขียนวิธีการค้นหาสินค้า &เราต้องการคืนสินค้าเริ่มต้น…
เราสามารถส่งคืนผลิตภัณฑ์ที่เป็นโมฆะเช่นนี้ได้ :
class MissingProduct def name "Product not found" end end
ตอนนี้ถ้าเรามีอาร์เรย์ที่มีส่วนผสมของวัตถุจริงและผลิตภัณฑ์ null ผลิตภัณฑ์เหล่านี้ทั้งหมดจะมี name
กระบวนการ. ซึ่งหมายความว่าคุณจะไม่ได้รับ NoMethodError
ข้อยกเว้น
เคล็ดลับ :หากคุณปฏิบัติต่อวัตถุทั้งหมดในลักษณะเดียวกัน โดยไม่ต้องตรวจสอบประเภทวัตถุ แสดงว่าคุณกำลังใช้ประโยชน์จาก Polymorphism
ออบเจ็กต์ประเภทนี้เหมาะสำหรับเลเยอร์การนำเสนอของคุณ แต่ไม่มากสำหรับผู้ควบคุมที่คุณต้องการทำสิ่งที่แตกต่างออกไปหากสิ่งที่คุณกำลังมองหาไม่พร้อมใช้งาน เช่น แสดงข้อความเตือน เปลี่ยนเส้นทาง ฯลฯ
ความจริงใจ
อีกสิ่งหนึ่งที่คุณต้องรู้เกี่ยวกับ nil
คือมันเป็นค่าเดียว นอกจาก false
(ซึ่งเป็นวัตถุด้วย) ที่ถือว่าเป็น "เท็จ"
อย่างอื่นใน Ruby ถือว่า true
ในบริบทบูลีน
บางภาษาพิจารณาตัวเลข 0
เป็น false
ค่า แต่นั่นไม่ใช่กรณีใน Ruby:
if 0 puts 123 end # 123
นี่กำลังพูดว่า:“ถ้า 0
คือ true
แล้วพิมพ์ 123
“.
วิดีโอ
สรุป
คุณได้เรียนรู้ว่า nil
เป็นเพียงวัตถุทับทิมที่แสดงถึง "ไม่มีอะไร"
คุณยังได้เรียนรู้ว่า nil
&false
เป็นเพียงสองสิ่งใน Ruby ที่ "ไม่จริง" อย่างอื่นคือ “ความจริง”
หากคุณชอบโพสต์นี้อย่าลืม แชร์ บนเครือข่ายโซเชียลที่คุณชื่นชอบ!