2012-01-10 25 views
10

Groovy:Có phòng ngừa null tương đương trên các thuộc tính xích của groovy trong ruby ​​không?

nếu there`s my_object -> truy cập 'name' và tận dụng

my_object?.name?.capitalize() 

tương đương cho ruby ​​để tránh một đối tượng bằng không các thuộc tính truy cập với thiết bị này là gì?

Cảm ơn

+1

này cũng tương tự như http://stackoverflow.com/questions/8721949/simplify-multiple-nil-checking-in-rails/8722096#8722096 – iain

Trả lời

9

này hoạt động trong Rails:

my_object.try(:name).try(:capitalize) 

Nếu bạn muốn nó để làm việc trong Ruby bạn cần phải mở rộng Object như thế này:

class Object 
    ## 
    # @person ? @person.name : nil 
    # vs 
    # @person.try(:name) 
    def try(method) 
    send method if respond_to? method 
    end 
end 

Source

Trong Rails được triển khai như sau:

class Object 
    def try(*a, &b) 
    if a.empty? && block_given? 
     yield self 
    else 
     __send__(*a, &b) 
    end 
    end 
end 

class NilClass 
    def try(*args) 
    nil 
    end 
end 
+1

đáng chú ý, điều này khác với 'ObjectSupport'' Object # try'. Triển khai 'ActiveSupport' về cơ bản chỉ là' send', ngoại trừ 'nil.try' luôn trả về' nil' –

+0

Cảm ơn @MatthewRudy. Điều này là tốt hơn vì nó cũng chấp nhận các khối và tham số. – Mischa

-3

Giả sử bạn muốn tránh lỗi nil nếu my_object là không. Hãy thử:

my_object?.name?.capitalize() unless my_object.nil? 

Ruby sẽ thực hiện kiểm tra nil trước và sau đó thử truy cập thuộc tính nếu my_object không phải là rỗng.

Dave

+1

Tôi nghĩ rằng điểm của câu hỏi là làm thế nào để làm cho nó hoạt không có 'trừ' hoặc' if'. – Mischa

+1

Có một '? .'? –

+0

Tôi nhận được 'phương thức undefined 'my_object?'' Nếu 'my_object' được định nghĩa. –

4

andand gem cung cấp chức năng này.

my_object.andand.name.andand.capitalize() 
+0

với cùng một ý tưởng (và tác giả), Ick có thể là: http://ick.rubyforge.org/ – tokland

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