17

Ruby 2.3.0 では、前のステートメントの値がnilでない場合にのみメソッドを呼び出す新しい演算子を導入することで、チェーンされたメソッド呼び出しの nil 処理を容易にする安全なナビゲーション構文が導入されています。これは、C#、Groovy、Swift などに既に存在する機能です。たとえばGroovyでは、構文は次のとおりです。

foo?.bar

これは基本的に、foonullでない限り、結果の値がfoo.barの値であることを意味します。その場合、戻り値もnullであるため、例外はスローされません。また、C# (ヌル条件演算子と呼ばれる) とSwift (オプショナル チェーン式と呼ばれる) もこの表記法を使用します。

したがって、構文は他の言語では非常に標準的なようです。さて、なぜRubyの構文は

foo&.bar

代わりは?

4

1 に答える 1

27

この回答は、Ruby の問題追跡での機能要求の議論に基づいています。Ruby の作者である Yukihiro Matsumotoによると、 Rubyに演算子を導入することはできません。?.なぜなら、foo?それは有効なメソッド名であり、解析できなかったからです。演算子の最初の候補は逆順.?でした。その構文はすでに(中田信義によって)実装されていましたが、他の言語によって導入された元の構文に近すぎると考えられたため、後で破棄されました (前述のように実現可能ではありませんでした)。松本が提案したように、最終的な構文&.が受け入れられました。

松本によって与えられたこの構文の正当性は次のとおりです

私はしばらくこれについて考え、&.代わりにを導入することを考えています.?。理由は次のとおりです。

  • .?は Swift や他の言語と似て?.いますが、とにかく異なります。
  • はRubyのメソッド名の有効な接尾辞であるため?、私たちのプログラムではすでに多くの疑問符が見られます.
  • u&.profileの短縮形を思い起こさせu && u.profileます。

ただし、 の動作は&.維持する必要があります。つまり、スキップする必要がありますnilが、 を認識しfalseます。

その後、この構文はRuby 2.3.0-preview1の一部としてリリースされました。

于 2015-11-16T12:19:28.613 に答える