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

ทุกสิ่งที่คุณต้องรู้เกี่ยวกับ Nil

ไม่มี…

มันคืออะไร?

ก็ 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 ที่ "ไม่จริง" อย่างอื่นคือ “ความจริง”

หากคุณชอบโพสต์นี้อย่าลืม แชร์ บนเครือข่ายโซเชียลที่คุณชื่นชอบ!