は
航行安全演算子(&コメント
に
@Redithionに同意します。)ルビー
シナリオ
にあなたがowner
があり、所有者のaddress
を取得したいaccount
を持っている想像してみてください。あなたは無記号エラーのリスク、安全でないようにしたい場合は、次のようなものを記述します。
if account && account.owner && account.owner.address
...
end
これは、入力して本当に冗長と迷惑です。 - チェーンに沿っていくつかの値であれば、それのいずれかがアドレスまたはnil
を返し
if account.try(:owner).try(:address)
...
end
それは同じことを実現:activesupportのは、(後述するいくつかの重要な違いではなく)と同様の動作を持つtry
方法を含み、 nil
。最初の例では、たとえばowner
がfalseに設定されている場合にfalseを返すこともあります。
&を使用します。
は、我々は安全なナビゲーション演算子を使用して、前の例を書き換えることができます。
account&.owner&.address
より多くの例
のは、より詳細にすべての3つのアプローチを比較してみましょう。
account = Account.new(owner: nil) # account without an owner
account.owner.address
# => NoMethodError: undefined method `address' for nil:NilClass
account && account.owner && account.owner.address
# => nil
account.try(:owner).try(:address)
# => nil
account&.owner&.address
# => nil
これまでのところ驚きはありません。 owner
がfalse
の場合はどうなりますか(面白いコードのエキサイティングな世界ではそうはないが不可能ではない)?
account = Account.new(owner: false)
account.owner.address
# => NoMethodError: undefined method `address' for false:FalseClass `
account && account.owner && account.owner.address
# => false
account.try(:owner).try(:address)
# => nil
account&.owner&.address
# => undefined method `address' for false:FalseClass`
は、ここで最初の驚きが来る - &.
構文は唯一nil
をスキップしますが、誤認識して! s1 && s1.s2 && s1.s2.s3
構文とまったく同じではありません。
オーナーが存在しても、address
に反応しない場合はどうなりますか?例えば以下
account = Account.new(owner: Object.new)
account.owner.address
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>
account && account.owner && account.owner.address
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
account.try(:owner).try(:address)
# => nil
account&.owner&.address
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
混乱とnil&.nil?
はtrue
を返すべきです。
&.
演算子を使用して、nil
値をチェックするときは注意してください。
nil.nil?
# => true
nil?.nil?
# => false
nil&.nil?
# => nil
参考:here
彼らはあなたが違い[ここ](詳細を読むことができ、同じではありませんhttp://mitrev.net/ruby/2015/11/13次の例を考えてみましょう/ the-in-ruby /) – Redithion