2012-11-30 7 views
7

タイトルのため申し訳ありませんが、私はこの構文がどのように呼び出されるのかわかりません。例えばなぜこのコードはruby 1.9ではコンパイルされていませんが、ruby 1.8ではコンパイルされていますか?

ary = [ [11, [1]], [22, [2, 2]], [33, [3, 3, 3]] ] 
# want to get [ [11, 1], [22, 2], [33, 3] ] 

ルビー1.8

ary.map{|x, (y,)| [x, y] } 
#=> [[11, 1], [22, 2], [33, 3]] 

ary.map{|x, (y)| [x, y] } 
#Syntax error, unexpected '|', expecting tCOLON2 or '[' or '.' 
#ary.map{|x, (y)| [x, y] } 
#    ^

Ruby 1.9の

ary.map{|x, (y,)| [x, y] } 
#SyntaxError: (irb):95: syntax error, unexpected ')' 
#ary.map{|x, (y,)| [x, y] } 
#    ^

ary.map{|x, (y)| [x, y] } 
#=> [[11, 1], [22, 2], [33, 3]] 

私が欲しかった配列を取得する方法を求めていないのです。

私はを知りたいと思いますが、このコードはRubyのバージョンのいずれかであるが、両方ともではありません。

答えて

5

一般的に、Ruby 1.9は、リストやリストのような表現で、後のコンマを以前のバージョンよりも寛容にしていますが、構文エラーを引き起こす新しい機会がいくつかあります。これは1つのようです。 Ruby 1.9では、これをメソッド定義として厳密に扱い、その迷子カンマを許可しません。

また、訂正されたRuby 1.8.7のエッジケースのバグに対してもうんざりしているようです。リストの展開方法は、1つの項目だけでは機能しないようです。この場合

クイックフィックスは次のようになります。この場合

ary.map{|x, (y,_)| [x, y] } 

_機能どんな変数として。あなたが取得する必要の両方のバージョンでは

:末尾のコンマは `ルビー1.8`で必要とされていた場合

[[11, 1], [22, 2], [33, 3]] 
+0

、それは姿を消し、ルールのいくつかの種類があった意味ですか? – oldergod

+1

私はそれが問題を横断しているのでそれほど必要とは思わなかった。ブロック引数のセマンティクス全体が1.9で大幅に見直されました。デフォルトと '* args'型のcatch-allsオプションの引数がサポートされるようになりました。 1つのアイテムでリストを許可しないで、2番目の名前が実際に名前が付けられているかどうかを気にしないというこの風変わりな動作は削除されたようです。 – tadman

関連する問題