Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Hướng dẫn xác định về đối tượng Nil của Ruby: Nó là gì, cách hoạt động & tại sao quan trọng

Nil…

Nó thực sự là gì?

Vâng, nil là một đối tượng Ruby đặc biệt dùng để đại diện cho giá trị “rỗng” hoặc “mặc định”. Nó cũng là giá trị “falsy”, có nghĩa là nó hành xử như false khi dùng trong câu lệnh điều kiện.

Bây giờ:

Chỉ có DUY NHẤT một đối tượng nil, với object_id là 4 (hoặc 8 trong Ruby 64-bit), đây là một phần lý do nil đặc biệt.

nil.object_id # 4

Hãy nhìn sâu hơn!

Giá trị Nil đến từ đâu?

Nhiều phương thức có thể trả về nil làm kết quả.

Điều này xảy ra khi bạn yêu cầu một giá trị nhưng giá trị đó không có sẵn.

Ví dụ:

  • Sản phẩm không tìm thấy
  • Chỉ mục mảng vượt giới hạn
  • Key hash không tồn tại

Đây là mã minh họa:

arr = [1,2,3]
arr[5] # nil

Điều này thường dẫn đến nhiều vấn đề vì chúng ta mong đợi phương thức gọi trả về giá trị hợp lệ thay vì nil.

Như ngoại lệ NoMethodError này:

arr[5].size # NoMethodError: undefined method 'size' for nil:NilClass

Để tránh lỗi này, bạn cần kiểm tra nếu có giá trị nil trước khi gọi phương thức trên nó.

Kiểm tra Nil trong Ruby

Nếu bạn không muốn lỗi “undefined method for nil:NilClass” hãy thử này…

Chỉ gọi phương thức nếu không nil:

if array[5] && array[5].size
  # làm gì đó...
end

Đây là lý do Ruby 2.3 giới thiệu toán tử “safe navigator” (&.).

Ví dụ:

if arr[5]&.size
  # làm gì đó...
end

Cách khác kiểm tra nil là dùng phương thức nil?:

if @bacon.nil?
  # ...
end

Một tùy chọn khác là dùng phương thức blank? (chỉ Rails).

Tùy thuộc vào đối tượng bạn làm việc có một vài kỹ thuật để tránh kiểm tra giá trị nil hoàn toàn.

Ví dụ, bạn có thể dùng phương thức fetch trên Hash & Array.

Hoặc bạn có thể dùng “Null Object Pattern” trong class của bạn nếu muốn trả về giá trị mặc định thay vì nil.

Các nơi khác Nil潜伏

Bạn nên nhận ra biến instance chưa định nghĩa sẽ trả về nil.

@foo # nil

Vì vậy hãy cẩn thận, có thể bạn gõ sai tên biến instance hoặc quên khởi tạo nó!

Nơi khác bạn tìm thấy nil là với phương thức puts & print.

Hai phương thức này luôn trả về nil.

Tôi nhắc điều này vì tôi thấy một số học sinh của tôi thử làm thế này:

numbers = [1,2,3].map { |n| puts n * 2 }

Kết quả numbers thành [nil, nil, nil]. Giải pháp ở đây là đơn giản bỏ puts khỏi block.

Hiểu về NilClass

Giống như bất kỳ đối tượng Ruby nào nil có tập phương thức.

Đây là định nghĩa class từ Rubinius:

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ú ý tất cả các phương thức to_something này trả về giá trị rỗng (0 cho số).

Hash rỗng, chuỗi rỗng, mảng rỗng…

Lý do là nil dùng để đại diện cho “không có gì”.

Null Object Pattern (Mẫu Null Object)

Không có cuộc thảo luận về nil hoàn chỉnh nếu không nhắc đến Null Object Pattern.

Trong bài nói xuất sắc, “Nothing is Something”, Sandi Metz chỉ ra rằng trong khi nil nghĩa là “không có gì” nó có thể có ý nghĩa cụ thể hơn.

Ví dụ, nếu chúng ta viết phương thức tìm sản phẩm & muốn trả về sản phẩm mặc định…

Chúng ta có thể trả về null product như sau:

class MissingProduct
  def name
    "Product not found"
  end
end

Bây giờ nếu chúng ta có mảng mix giữa đối tượng sản phẩm thật & null product thì tất cả sản phẩm này sẽ có phương thức name. Điều này có nghĩa là bạn sẽ không nhận được ngoại lệ NoMethodError.

Mẹo: Nếu bạn có thể đối xử với tất cả đối tượng theo cùng cách, mà không cần kiểm tra kiểu đối tượng thì bạn đang tận dụng Polymorphism (Đa hình).

Loại đối tượng này tuyệt vời cho lớp trình bày (presentation layer), nhưng không phù hợp cho controllers nơi bạn muốn làm điều khác nếu thứ bạn tìm không có, như hiển thị cảnh báo, redirect, v.v.

Truthiness (Tính thật)

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

Mọi thứ khác trong Ruby được coi là true trong bối cảnh boolean.

Một số ngôn ngữ coi số 0 là giá trị false, nhưng không phải trong Ruby:

if 0
  puts 123
end
# 123

Điều này nói: “nếu 0 là true thì in 123”.

Video

Tóm tắt

Bạn đã học nil chỉ là đối tượng Ruby đại diện cho “không có gì”.

Bạn cũng học nil & false là hai thứ duy nhất trong Ruby là “falsy”. Mọi thứ khác là “truthy”.

Nếu bạn thích bài viết này đừng quên chia sẻ trên mạng xã hội yêu thích của bạn!