web-dev-qa-db-ja.com

nilの安全なナビゲーション演算子(&。)

As Ruby 2.3は、セーフナビゲーションオペレーターを導入します(&.)、別名孤独な演算子、nilオブジェクトの動作は奇妙に見えます。

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

それはこのように動作するように設計されていますか?または、孤独な演算子を追加したときにずれてしまったEdgeのケース?

26
sbs

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

33
mwp

これは、nil&.nil?nil && nil.nil?の省略形であるためです。これはnil && trueに評価され、nilになります。

trueの値に対して、(nil && x).nil?は常にxと評価されます。

構文には力がありますが、この特定のケースには、開発者にとって「落とし穴」になる可能性があります。

(stuff&.things).nil? =>ものが存在しない場合はtrueが生成され、stuff.thingsnilを返します。

以下のケースとの比較:

stuff&.things&.nil? => stuff.thingsnil以外のものを返す場合を除いて、すべての場合でnilが生成されます。その場合、falseが返されます。 。

falsenilを区別するという通常のブール論理では困難なため、これが通常の論理で意味をなすことはまずありません。

7
Oeste