Tất cả những gì bạn cần biết về nil trong ruby
Bài đăng này đã không được cập nhật trong 6 năm
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