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
là [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 0
là true
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!