この Ruby のタイプミスは何として解析されるのでしょうか?
概要
Ruby にはきちんとした安全ナビゲーション演算子があります。 foo&.bar と書くと、foo がたまたま nil でない限り、foo.bar が返されます。foo が nil の場合は、単純にショートして nil を返します。
さて、私は急いでいるプログラマなので、誤ってドットとアンパサンドを入れ替えて foo.&bar と入力してしまいました。解析エラーが発生すると予想していましたが、実際には
3.1.0 :002 > foo.&bar
(irb):2:in `<main>': undefined local variable or method `bar' for main:Object (NameError)
実際、bar というローカル変数を定義すると、それで問題ないようです。
3.1.0 :003 > bar = 42
=> 42
3.1.0 :004 > foo.&bar
=> 42
この状況での .& 解析とは何ですか?
解決策
Ruby の中置演算子は明示的なドットを使用して呼び出すことができるため、次の 2 つは同等です。
a + b
a.+(b)
同じことが単一のアンパサンド演算子にも当てはまり、通常は「ビットごとの論理積」演算を実行するために定義されます。また、Ruby では、演算子の順序に必要でない限り、引数リストの括弧を省略できます。したがって、 foo.&bar は実際には foo.& bar 、またはそれほどあいまいではない foo.&(bar) であり、これは foo & bar (foo の型が何であれ def & ) の明示的な呼び出しと同等です。