2012-01-04 4 views
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) 

答えて

0

は、メソッド名と(の間にスペースを削除します。 Rubyはこれが危険であると警告するために使用されており、場合によってはRuby 1.9をオフにしているようです。

+1

私は知っている、これらの括弧は、スペースの後の通常の方法括弧ではありません。私の直感は、それはまだ構文上有効でなければならないと言います。それはなぜですか? – johannes

+3

明らかに、マッツの脳のためです:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/84104?help-en –

+0

@Frederick Cheung:なぜ空間その時点で構文が*あいまいなので、警告を生成しています。メソッド呼び出しのかっこまたは最初の引数の括弧になる可能性があり、Matzはこの競合の解決策を見つけることができませんでした。 'a(b.c do; end)'が*構文エラー*である理由はまだ説明していません。 – DarkDust

関連する問題