7

タイトルで申し訳ありませんが、この構文がどのように呼び出されるかわかりません。

例えば:

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] }
#                ^

ルビー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 のバージョンのいずれかであり、両方ではありません。

4

1 に答える 1

5

一般に、Ruby 1.9 は、以前のバージョンよりもリストおよびリストのような表現の末尾のコンマについてはるかに寛大ですが、構文エラーをスローする新しい状況がいくつかあります。これはひとつだそうです。Ruby 1.9 では、これを厳密にメソッド定義として扱い、そのコンマを許可しません。

また、修正された Ruby 1.8.7 のエッジケースのバグに遭遇したようです。リスト展開メソッドは、1 つのアイテムだけでは機能しないようです。

この場合の簡単な修正は次のとおりです。

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

この場合、 whatever変数_として機能します。

両方のバージョンで、次を取得する必要があります。

[[11, 1], [22, 2], [33, 3]]
于 2012-11-30T06:56:01.173 に答える