2012-06-22 20 views
22

Trong Groovy, có một cú pháp tốt để làm việc với các giá trị null.Ruby có cú pháp cho toán tử điều hướng an toàn của các giá trị nil, như trong Groovy không?

Ví dụ, tôi có thể làm một câu lệnh if:

if (obj1?.obj2?.value) { 

} 

này sẽ không ném một NullPointerException ngay cả khi obj1 là null (nó sẽ đánh giá false).

Đây là một cái gì đó rất thuận tiện, vì vậy tự hỏi nếu có một Ruby tương đương tôi bị mất.

+2

http://stackoverflow.com/questions/8805582/is-there-an-equivalent-null-prevention- on-xích-thuộc tính-of-groovy-in-ruby –

+0

cảm ơn! Cũng tìm thấy đá quý andand vừa mới cố gắng giới thiệu điều này với ruby ​​thông qua một phương pháp: http://weblog.raganwald.com/2008/01/objectandand-objectme-in-ruby.html –

+0

Chưa có bản phát hành ổn định, nhưng nhánh phát triển của Ruby bây giờ có toán tử '.?'. Xem https://bugs.ruby-lang.org/issues/11537?utm_source=rubyweekly&utm_medium=email#note-12 –

Trả lời

23

Trong một ứng dụng đường ray có Object#try

Vì vậy, bạn có thể làm

obj1.try(:obj2).try(:value) 

hoặc với một khối (như đã nói trên bình luận dưới đây)

obj.try {|obj| obj.value} 

CẬP NHẬT

Trong ruby ​​2.3 có o perator cho việc này:

obj&.value&.foo 

Mà là giống như obj && obj.value && obj.value.foo

+3

Hoặc luân phiên: 'obj.try {| obj | obj.value} '- chế độ khối thường làm cho IMHO trực quan hơn. –

+0

Cú pháp khối này có ý nghĩa nhất khi bạn muốn làm điều gì đó với giá trị như gọi một phương thức trên đó. –

+0

Một mẫu chung để giải quyết loại vấn đề này là [đối tượng rỗng] (http://robots.thoughtbot.com/post/20907555103/rails-refactoring-example-introduce-null-object). –

2

try là cách tiêu chuẩn duy nhất để làm điều này trước khi Ruby 2.3. Với Ruby 2.3 bạn có thể làm:

if obj1&.obj2&.value 

end 

Ngoài ra, nếu bạn có một cấu trúc băm, bạn có thể sử dụng toán tử _. với Hashie:

require 'hashie' 
myhash = Hashie::Mash.new({foo: {bar: "blah" }}) 

myhash.foo.bar 
=> "blah"  

myhash.foo? 
=> true 

# use "underscore dot" for multi-level testing 
myhash.foo_.bar? 
=> true 
myhash.foo_.huh_.what? 
=> false 
+0

Vì vậy, hãy thử * là * cách duy nhất để làm điều này khi tôi trả lời câu hỏi. Các &. ký hiệu vừa được thêm vào với Ruby 2.3. Downvote không thực sự cần thiết, một bình luận hoặc chỉnh sửa sẽ được đánh giá cao. –

+0

Không chắc chắn nếu downvote của bạn có liên quan, nhưng tôi chỉ thực hiện một chỉnh sửa bởi vì bạn đang sử dụng cú pháp JavaScript cho câu lệnh if của bạn. – jeremywoertink

Các vấn đề liên quan