Computer >> Máy Tính >  >> Lập trình >> Ruby

Mọi thứ bạn cần biết về Nil

Không…

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

Chà, nil là một đối tượng Ruby đặc biệt được sử dụng để đại diện cho một giá trị "trống" hoặc "mặc định". Nó cũng là một giá trị "falsy", nghĩa là nó hoạt động giống như false khi được sử dụng trong một câu lệnh điều kiện.

Bây giờ :

CHỈ CÓ MỘT nil đối tượng, với một object_id trong tổng số 4 (hoặc 8 trong Ruby 64-bit), đây là một phần lý do tại sao nil là đặc biệt.

nil.object_id
# 4

Hãy cùng tìm hiểu sâu hơn!

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

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

Đ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ụ :

  • Không tìm thấy sản phẩm
  • Chỉ mục mảng nằm ngoài giới hạn
  • Khóa băm không tồn tại

Dưới đây là một số mã để chứng minh điều này :

arr = [1,2,3]

arr[5]
# nil

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

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

arr[5].size

# NoMethodError: undefined method 'size' for nil:NilClass

Để tránh lỗi này, bạn cần kiểm tra xem mình có nil không giá trị trước khi bạn gọi một phương thức trên đó.

Kiểm tra Nil trong Ruby

Nếu bạn không muốn gặp lỗi “phương thức không xác định cho nil:NilClass”, hãy thử cách này…

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

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

Đây là lý do tại sao Ruby 2.3 giới thiệu toán tử “điều hướng an toàn” (&. ).

Ví dụ :

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

Một cách khác để kiểm tra nil là sử dụng nil? phương pháp:

if @bacon.nil?
  # ...
end

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

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

Ví dụ:bạn có thể sử dụng fetch trên các đối tượng Hash &Array.

Hoặc bạn có thể sử dụng “Mẫu đối tượng rỗng” trong các lớp của riêng mình nếu bạn muốn trả về giá trị mặc định thay vì nil .

Những nơi khác nơi Nil ẩn náu

Bạn nên biết rằng các biến phiên bản không xác định sẽ trả về nil .

@foo

# nil

Vì vậy, hãy coi chừng điều đó, có thể xảy ra trường hợp bạn viết sai tên của biến phiên bản của mình hoặc bạn quên khởi tạo nó!

Một nơi khác mà bạn có thể tìm thấy nil là với puts &print phương pháp.

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

Tôi đề cập đến vấn đề này vì tôi đã thấy một số sinh viên của mình thử một cái gì đó như thế này:

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

Kết quả là numbers[nil, nil, nil] . Giải pháp trong trường hợp này là chỉ cần loại bỏ các puts từ bên trong khối.

Hiểu NilClass

Cũng giống như bất kỳ đối tượng Ruby nào khác nil có một tập hợp các phương pháp.

Đây là định nghĩa lớp 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

Lưu ý cách tất cả những to_something này các phương thức trả về giá trị trống (0 cho số).

Băm trống, chuỗi trống, mảng trống…

Lý do cho điều này là nil được sử dụng để biểu thị "không có gì".

Mẫu đối tượng rỗng

Không thảo luận về nil hoàn chỉnh mà không đề cập đến Mẫu đối tượng rỗng.

Trong bài nói chuyện xuất sắc của cô ấy, “Nothing is Something”, Sandi Metz đã đưa ra quan điểm rằng trong khi nil nghĩa là "không có gì" nó có thể có một ý nghĩa cụ thể hơn.

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

Chúng tôi có thể trả lại sản phẩm rỗng như sản phẩm này :

class MissingProduct
  def name
    "Product not found"
  end
end

Bây giờ nếu chúng ta có một mảng với sự kết hợp của các đối tượng sản phẩm thực &sản phẩm rỗng thì tất cả các sản phẩm này sẽ có tên name phương pháp. Điều này có nghĩa là bạn sẽ không nhận được NoMethodError ngoại lệ.

Mẹo :Nếu bạn có thể xử lý tất cả các đối tượng của mình theo cùng một cách mà không cần phải kiểm tra loại đối tượng thì bạn đang tận dụng tính đa hình.

Những loại đối tượng này rất tốt cho lớp bản trình bày của bạn, nhưng không quá nhiều đối với bộ điều khiển nơi bạn muốn làm điều gì đó khác biệt nếu những gì bạn đang tìm kiếm không có sẵn, chẳng hạn như hiển thị thông báo cảnh báo, chuyển hướng, v.v.

Độ tin cậy

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

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

Một số ngôn ngữ coi số 0 dưới dạng false giá trị, nhưng đó không phải là trường hợp trong Ruby:

if 0
  puts 123
end

# 123

Đây là câu nói:“if 0true sau đó in 123 “.

Video

Tóm tắt

Bạn đã biết rằng nil chỉ là một đối tượng Ruby đại diện cho "không có gì".

Bạn cũng đã biết rằng nil &false là hai thứ duy nhất trong Ruby là "giả". Mọi thứ khác đều là "sự thật".

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