12/08/2018, 14:02

Ruby Nil Object

1. Giới thiệu Trong C++, Java… có đối tượng NULL thì trong Ruby chúng được gọi là nil . Đây là một đối tượng mô tả giá trị “không có”, ý nói một biến không có giá trị gì cả. nil là một đối tượng tĩnh, tức là trong Ruby chỉ có một đối tượng nil duy nhất giống như đối tượng ...

1. Giới thiệu

Trong C++, Java… có đối tượng NULL thì trong Ruby chúng được gọi là nil. Đây là một đối tượng mô tả giá trị “không có”, ý nói một biến không có giá trị gì cả. nil là một đối tượng tĩnh, tức là trong Ruby chỉ có một đối tượng nil duy nhất giống như đối tượng true hay false vậy, nil được tạo ra từ lớp NilClass.

2. Nil và rỗng?

Để dễ hình dung, ta xét một ví dụ đơn giản trong java:

string str_a = null // nil
string str_b = "" // rỗng

Dòng code đầu tiên biểu thị của việc không có đối tượng kiểu string tồn tại trong bộ nhớ - KHÔNG TỒN TẠI. Dòng code thứ hai biểu thị có tồn tại đối tượng string trong bộ nhớ và dữ liệu của đối tượng này đang có là một chuỗi không chứa ký tự nào cả - TỒN TẠI CÁI KHÔNG CÓ GÌ.

Điều khác biệt thứ 2 của 2 dòng codes trên là str_a chứa một thông tin để ta có thể kiểm tra được là đối tượng str_a chưa tồn tại, còn str_b thì đã tồn tại rồi. Nếu ta xem các dòng code trên là SỰ KHỞI ĐẦU của một biến thì dường như str_b là một sự thiên vị khi ta hy sinh 1 giá trị (rỗng) để đánh dấu cho sự khởi đầu của str_b, trong khi đó chính ngôn ngữ lập trình đã thiết kế sẵn cho ta null để đánh dấu như một trường hợp đặc biệt.

3. Nil object

puts nil
p nil

p $val

p $val1 == $val2

Phương thức puts sẽ in chuỗi rỗng của đối tượng nil, trong khi phương thức p lại in chuỗi "nil" ra màn hình.

Nếu chúng ta in một biến chưa có giá trị thì Ruby sẽ hiển thị là nil.

p $val1 == $val2

Dòng code trên sẽ trả về true vì đối tượng nil là một đối tượng tĩnh và nó chỉ có 1.

4. NilClass

Public Instance Methods

static VALUE
nil_inspect(VALUE obj){
  return rb_usascii_str_new2("nil");
}

inspect -> "nil"

Luôn trả về string "nil"

    static VALUE
rb_true(VALUE obj){
    return Qtrue;
}

nil? -> true

Chỉ những object nil mới trả về true

Một số methods khác

nil.to_a   #=> []
nil.to_f   #=> 0.0
nil.to_h   #=> {}
nil.to_i   #=> 0
nil.to_s   #=> ""

Tham khảo

https://ruby-doc.org/core-2.3.0/NilClass.html

0