2016-01-04 19 views
22

Ruby 2.3では安全なナビゲーションオペレータ(&.)、孤独なオペレータが導入されているため、nilオブジェクトの動作は奇妙に見えます。安全ナビゲーションオペレータ(&。)for nil

nil.nil? # => true 
nil&.nil? # => nil 

これは、このように動作するように設計されていますか?または、孤独な演算子を追加するときに逃げたいくつかのエッジケース?

+1

なぜあなたに奇妙に見えるのかはっきりしません。 – sawa

+0

これはRailsで 'try'を使うよりもなぜ優れていますか? – Jwan622

+0

@ Jwan622これは 'try'からインスピレーションを受けたものだと思います。 –

答えて

28

foo&.barは、foo && foo.barの略語なので、式nil && nil.nil?の結果はどうなると思いますか?

+18

実際、 'foo && foo.bar'とはちょっと違います。むしろ '(foo == nil)ですか? nil:foo.bar'を返します。つまり、メソッド受信側が 'nil'であるかどうかだけを確認します。これは 'foo'が' false'のときに関係します。 – codener

5

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を生成します。

falsenilを区別する通常のブール論理の難しさのため、これは通常のロジックでは意味をなさないでしょう。

+0

'nil && nil.nil?'は 'nil'に直接評価され、' nil.nil? 'は問題になりません。 'nil &&(puts 1)'を試してください。何も表示されません。 – sbs

+0

@sbs修正します。それは[ショートサーキット評価](https://en.wikipedia.org/wiki/Short-circuit_evaluation)と呼ばれています。 –

+3

問題を避けるには '#nil? 'を呼び出すのに常に安全なので、'&.nil? 'は避けてください。代わりに 'stuff&.things.nil?'を実行してください。 –