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
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
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
Tham khảo: https://www.rubyguides.com/2018/01/ruby-nil/
All rights reserved