Viblo CTF
+1

Tất cả những gì bạn cần biết về nil trong ruby

Bạn đang code ruby chắc chẳng lạ gì với nil cả. Bài viết sau sẽ giúp các bạn hiểu hơn về nó. nil đơn giản vẫn là 1 object

nil.class
# NilClass

trong ruby chỉ có duy nhất 1 object nil với object_id = 4 (8 trong ruby 64bit)

nil.object_id
# 8

NilClass

Giống như những object khác, nil cũng có 1 số phương thức được định nghĩa trong NilClass như sau:

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

Để ý chúng ta thấy những method to_something đều trả về giá trị rỗng (0 với number) chính vậy nên nil được đại diện cho nothing - không gì cả.

Giá trị nil xuất hiện khi nào?

Rất nhiều method trả về giá trị nil khi bạn muốn biết giá trị đó có tồn tại hay không. Ví dụ:

arr = [1,2,3]
arr[5]
# nil

trong trường hợp ta sử method với các giá trị không tồn tại sẽ bị lỗi, ví dụ như sau:

arr[5].size
# NoMethodError: undefined method \'size\' for nil:NilClass

để tránh exception như vậy ta sử dụng giá trị nil trước khi gọi method.

if array[5] && array[5].size
  # do something...
end

Tùy vào đối tượng mà bạn sử dụng cách kiểm tra giá trị nil khác nhau. Ví dụ ở Hash và Array bạn có thể sử dụng fetch

Ngoài ra, nil còn là giá trị mặc định của 1 biến instance và là giá trị trả về của hàm puts và print

@foo
# nil

numbers = [1,2,3].map { |n| puts n * 2 }
# [nil, nil, nil]

Null Object Pattern

Khi bàn luận về nil thì ta không thể không nhắc đến Null Object Pattern. ví dụ, nếu chúng ta viết một method tìm kiếm 1 product và muốn trả về một giá trị mặc định. Chúng ta có thể trả về một nil product bằng cách sau:

class MissingProduct
  def name
    "Product not found"
  end
end

Truthiness

Trong ruby, chỉ có duy nhất nil là giá trị khi chuyển sang boolean là giá trị false còn lại tất cả giá trị khác đều là true Kể cả số 0. một số ngôn ngữ có thể mang giá trị false nhưng ruby thì vẫn là true

!!nil
# false
!!0
# true

All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.