3
なぜruby18とruby19構文エラーでこのコードを与える:`a(b.c do; end)`が構文的に正しいRubyプログラムではないのはなぜですか?
a (b.c do;end)
私はそれが次のことを意味すると予想しているでしょう。 1つの引数を持つメソッドa
への呼び出し。空白の後のかっこはメソッドの引数の括弧ではありませんが、あなたのような普通の括弧だけがほとんどどこにでも置くことができます。引数はブロックb
のオブジェクトc
への呼び出しの戻り値です。
しかし、以下はすべてruby18で構文的に正しいと解釈されます。これらの例の最初のものだけがruby19によって構文的に正しくないものとして扱われます。
a (b do;end)
と:
a (b.c {})
と:
(b.c do;end)
私は知っている、これらの括弧は、スペースの後の通常の方法括弧ではありません。私の直感は、それはまだ構文上有効でなければならないと言います。それはなぜですか? – johannes
明らかに、マッツの脳のためです:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/84104?help-en –
@Frederick Cheung:なぜ空間その時点で構文が*あいまいなので、警告を生成しています。メソッド呼び出しのかっこまたは最初の引数の括弧になる可能性があり、Matzはこの競合の解決策を見つけることができませんでした。 'a(b.c do; end)'が*構文エラー*である理由はまだ説明していません。 – DarkDust