ไม่มี…
มันคืออะไร?
ก็ 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 ที่ "ไม่จริง" อย่างอื่นคือ “ความจริง”
หากคุณชอบโพสต์นี้อย่าลืม แชร์ บนเครือข่ายโซเชียลที่คุณชื่นชอบ!