なGroovy:rubyのgroovyのチェーン属性に相当するヌル防止はありますか?
there`s my_objectを場合 - >アクセスの 'name' とは
my_object?.name?.capitalize()
この施設でアクセス属性にnilのオブジェクトを避けるためにルビーの等価は何かを大文字?あなたはmy_objectをがnilの場合はnilエラーを回避したい意味と仮定すると、
おかげ
なGroovy:rubyのgroovyのチェーン属性に相当するヌル防止はありますか?
there`s my_objectを場合 - >アクセスの 'name' とは
my_object?.name?.capitalize()
この施設でアクセス属性にnilのオブジェクトを避けるためにルビーの等価は何かを大文字?あなたはmy_objectをがnilの場合はnilエラーを回避したい意味と仮定すると、
おかげ
これは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
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
特に、これは 'ActiveSupport'の' Object#try'とは異なります。 'ActiveSupport'の実装は、基本的に' send'ですが、 'nil.try'は常に' nil'を返します。 –
ありがとう@MatthewRudy。これは、ブロックとパラメータも受け付けるので、これが優れています。 – Mischa
。試してみてください:
my_object?.name?.capitalize() unless my_object.nil?
Rubyは最初にnilチェックを行い、my_objectがnullでない場合にのみ属性にアクセスします。
デイブ
私は質問のポイントはそれを動作させる方法だと思う似ています'unless'や' if'を除いて。 – Mischa
「?」がありますか? –
'my_object'が定義されていれば'未定義のメソッド 'my_object?' 'を取得します。 –
andand gemは、この機能を提供します。
my_object.andand.name.andand.capitalize()
と同じアイデア(と著者)、Ickの多分:http://ick.rubyforge.org/ – tokland
これはhttp://stackoverflow.com/questions/8721949/simplify-multiple-nil-checking-in-rails/8722096#8722096 – iain