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/