As Ruby 2.3は、セーフナビゲーションオペレーターを導入します(&.
)、別名孤独な演算子、nil
オブジェクトの動作は奇妙に見えます。
nil.nil? # => true
nil&.nil? # => nil
それはこのように動作するように設計されていますか?または、孤独な演算子を追加したときにずれてしまったEdgeのケース?
foo&.bar
はfoo && foo.bar
の省略形なので、式nil && nil.nil?
の結果はどうなると思いますか?
これは、nil&.nil?
がnil && nil.nil?
の省略形であるためです。これはnil && true
に評価され、nil
になります。
true
の値に対して、(nil && x).nil?
は常にx
と評価されます。
構文には力がありますが、この特定のケースには、開発者にとって「落とし穴」になる可能性があります。
(stuff&.things).nil?
=>ものが存在しない場合はtrue
が生成され、stuff.things
はnil
を返します。
以下のケースとの比較:
stuff&.things&.nil?
=> stuff.things
がnil
以外のものを返す場合を除いて、すべての場合でnil
が生成されます。その場合、false
が返されます。 。
false
とnil
を区別するという通常のブール論理では困難なため、これが通常の論理で意味をなすことはまずありません。