2012-01-10 4 views
10

なGroovy:ruby​​のgroovyのチェーン属性に相当するヌル防止はありますか?

there`s my_objectを場合 - >アクセスの 'name' とは

my_object?.name?.capitalize() 

この施設でアクセス属性にnilのオブジェクトを避けるためにルビーの等価は何かを大文字?あなたはmy_objectをがnilの場合はnilエラーを回避したい意味と仮定すると、

おかげ

+1

これはhttp://stackoverflow.com/questions/8721949/simplify-multiple-nil-checking-in-rails/8722096#8722096 – iain

答えて

9

これはRailsの中で動作します。

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

あなたはそれがRubyで仕事をしたい場合は、このようObjectを拡張する必要があります。では

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

Source

Railsこれは次のように実装されています:

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

特に、これは 'ActiveSupport'の' Object#try'とは異なります。 'ActiveSupport'の実装は、基本的に' send'ですが、 'nil.try'は常に' nil'を返します。 –

+0

ありがとう@MatthewRudy。これは、ブロックとパラメータも受け付けるので、これが優れています。 – Mischa

-3

。試してみてください:

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

Rubyは最初にnilチェックを行い、my_objectがnullでない場合にのみ属性にアクセスします。

デイブ

+1

私は質問のポイントはそれを動作させる方法だと思う似ています'unless'や' if'を除いて。 – Mischa

+1

「?」がありますか? –

+0

'my_object'が定義されていれば'未定義のメソッド 'my_object?' 'を取得します。 –

4

andand gemは、この機能を提供します。

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

と同じアイデア(と著者)、Ickの多分:http://ick.rubyforge.org/ – tokland

関連する問題