12/08/2018, 16:47

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 giống như những object khác, nil cũng có 1 số ...

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

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ả.

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]

No discussion about nil is complete without mentioning the Null Object Pattern. Khi bàn luận về nil thì ta không thể không nhắc đến Null Object Pattern. Trong 1 bài chia sẻ của Sandi Metz “Nothing is Something“ đã đề cập rằng khi nil có nghĩa là nothing nhưng nó có thể có ý nghĩa cụ thể hơn thế. 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

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

Tham khảo: https://www.rubyguides.com/2018/01/ruby-nil/

0