Ruby 2.3では安全なナビゲーションオペレータ(&.
)、孤独なオペレータが導入されているため、nil
オブジェクトの動作は奇妙に見えます。安全ナビゲーションオペレータ(&。)for nil
nil.nil? # => true
nil&.nil? # => nil
これは、このように動作するように設計されていますか?または、孤独な演算子を追加するときに逃げたいくつかのエッジケース?
Ruby 2.3では安全なナビゲーションオペレータ(&.
)、孤独なオペレータが導入されているため、nil
オブジェクトの動作は奇妙に見えます。安全ナビゲーションオペレータ(&。)for nil
nil.nil? # => true
nil&.nil? # => nil
これは、このように動作するように設計されていますか?または、孤独な演算子を追加するときに逃げたいくつかのエッジケース?
foo&.bar
は、foo && foo.bar
の略語なので、式nil && nil.nil?
の結果はどうなると思いますか?
実際、 'foo && foo.bar'とはちょっと違います。むしろ '(foo == nil)ですか? nil:foo.bar'を返します。つまり、メソッド受信側が 'nil'であるかどうかだけを確認します。これは 'foo'が' false'のときに関係します。 – codener
nil&.nil?
は、nil && nil.nil?
の略です。これはnil && true
と評価され、それはnil
となります。
(nil && x).nil?
は、x
の任意の値に対して常にtrue
と評価されます。
構文は力を持って、この特定の場合には、開発者のための「落とし穴」になるためのいくつかの可能性がありますが:
(stuff&.things).nil?
=>ものが存在し、またはstuff.things
戻りnil
ていない場合、これはtrue
を生成します。以下の場合対
:
stuff&.things&.nil?
=>これは、false
を返します。その場合にはstuff.things
戻りnil
以外の何かを、場合を除き、すべてのケースでnil
を生成します。
false
とnil
を区別する通常のブール論理の難しさのため、これは通常のロジックでは意味をなさないでしょう。
'nil && nil.nil?'は 'nil'に直接評価され、' nil.nil? 'は問題になりません。 'nil &&(puts 1)'を試してください。何も表示されません。 – sbs
@sbs修正します。それは[ショートサーキット評価](https://en.wikipedia.org/wiki/Short-circuit_evaluation)と呼ばれています。 –
問題を避けるには '#nil? 'を呼び出すのに常に安全なので、'&.nil? 'は避けてください。代わりに 'stuff&.things.nil?'を実行してください。 –
なぜあなたに奇妙に見えるのかはっきりしません。 – sawa
これはRailsで 'try'を使うよりもなぜ優れていますか? – Jwan622
@ Jwan622これは 'try'からインスピレーションを受けたものだと思います。 –