+1

Tất tần tật về Nil trong Ruby - Đơn giản nhưng bạn đã biết chưa ?

Nil từ góc nhìn bên ngoài

Nil dùng để đại diện cho một giá trị rỗng hoặc một giá trị mặc định trong Ruby. Có thể hiểu nôm na Nil chính là Null trong các ngôn ngữ lập trình khác.

Nil là một đối tượng đặc biệt, ta có thể check bằng đoạn code

nil.object_id #=> 8

Điều này cho ta thấy, chỉ có duy nhất một đối tượng nil và nó luôn có duy nhất một id = 8(4 đối với một số phiên bản cũ). Và đây cũng chính là điều làm cho nil đặc biệt hơn so với đa số các object khác (Ngoài ra còn có false, true,.. tất cả mọi thử ở ruby đều là object mà 😄 )

Dùng như thế nào?

Nil có thể dùng để làm output cho một method nào đó

def some_method
if condition
  #do somthing
else
  nil
end

Hoặc nil cũng được trả ra khi bạn gọi một giá trị chưa được khai báo trước đó

VD như là:

+Một giá trị chưa được khai báo

+Một giá trị nằm ngoài phạm vi của một mảng

+Một key không tồn tại trong một chuỗi hash

Thỉnh thoảng những new dev cũng hay mắc lỗi như bên dưới, thực hiện phép tính, gọi hàm, chấm phẩy các kiểu với một đối tượng có giá trị nil 😄

Với một dòng code như này trong project thì rất tai hại nếu như bạn không chắc chắn rằng đối tượng bạn sử dụng sẽ có trường hợp trả ra nil

Để khắc phục điều đó thì ta nên kiểm tra trước, khá đơn giản:

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

hoặc với một đối tượng

if some_object.nil?
  # do something...
end

Ruby cũng có 2 cách viết ngắn gọn hơn để tối giản hóa cho dòng code user.nil? ? nil : user.name

user.try(:name)
hoặc
user&.name

Nếu bạn sử dụng Rails thì có thể some_object.blank? cũng check được nil. Nên nhớ blank? là phương thức của Rails, Ruby thuần không có. Và blank? cũng có một số điểm khác biệt so với nil? nhé

Tùy thuộc vào đối tượng bạn đang làm việc sẽ có một số kỹ thuật bạn có thể sử dụng để tránh hoàn toàn các lỗi liên quan đến giá trị nil.

Với Hash & Array, bạn có thể sử dụng phương thức tìm fetch trên các đối tượng đó

Hoặc bạn có thể sử dụng “Null Object Pattern” trong các lớp của riêng bạn nếu bạn muốn trả về giá trị mặc định thay vì nil.

Mổ xẻ bên trong

Vì nil là một đối tượng nên chắc chắn sẽ có class nil ?

Đúng vậy, Nil tạo từ NilClass. Và sau đây là những gì chứa ở trong NilClass

Nhìn sơ qua ta cũng đã thấy điều đặc biệt của class này rồi đúng không. Tất cả những method trong hàm đều trả về giá trị rỗng hoặc 0

nil.to_s => ""
nil.to_i => 0
nil.to_f => 0.0
nil.to_a => []
nil.to_h => {}
nil.inspect => "nil"
nil.nil? => true # chả lẽ false =)))

"Nothing means something" đó là cách mà người ta nói về Nil(ở đây là nothing). Vâng, nil cũng chính là một cái gì đó

Một điều khác bạn cần biết về nil là nó là giá trị duy nhất, ngoài false (cũng là một đối tượng), được coi là "falsy".

Ngoài ra, mọi thứ khác trong Ruby đều được coi là đúng trong ngữ cảnh boolean.

Một số ngôn ngữ lập trình khác coi số 0 là một giá trị false, nhưng với Ruby thì nó là true

Đoạn code này có nghĩa là

if 0 == true
  puts "123"
end

Và nếu 0 là true thì bạn nghĩ sao về đoạn code dưới đây 😄

Tham khảo

https://www.rubyguides.com/2018/01/ruby-nil/


All Rights Reserved

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