2012-11-30 13 views
7

Przepraszamy za tytuł, nie wiem, jak nazywa się tę składnię.Dlaczego ten kod nie kompiluje się na Rubim 1.9, ale na rubie 1.8?

Na przykład:

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

Ruby 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]] 

Nie pytam o sposób, aby uzyskać żądaną tablicę.

Chciałbym wiedzieć, , dlaczego ten fragment kodu działa, jest jedną z wersji Ruby, ale nie obu.

Odpowiedz

5

Podczas gdy Ruby 1.9 jest o wiele łagodniejszy w kwestii końcowych przecinków na listach i reprezentacjach w listingu niż w poprzednich wersjach, jest kilka nowych okazji, w których spowoduje błąd składni. To wydaje się być jednym. Ruby 1.9 traktuje to jako ściśle określoną definicję metody i nie pozwala na to bezpańskie przecinki.

Wydaje się również, że masz do czynienia z błędem krawędziowym w Rubim 1.8.7, który został poprawiony. Metoda rozwijania listy wydaje się nie działać z tylko jednym elementem.

Quick Fix w tym przypadku może być:

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

W tym przypadku _ funkcjonuje jako zmiennej cokolwiek.

w obu wersjach należy uzyskać:

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

Jeżeli przecinek spływu było potrzebne w 'Ruby 1.8', to znaczy tam była jakaś reguła, że ​​zniknął? – oldergod

+1

Nie sądzę, że było to potrzebne tak bardzo, jak po stronie problemu. Cała semantyka argumentów blokowych uzyskała ogromny przegląd w wersji 1.9. Opcjonalne argumenty z wartościami domyślnymi i catch-all typu * * args' są teraz obsługiwane. To dziwaczne zachowanie polegające na tym, że nie zezwala się na listę z jednym przedmiotem, ale nie opiekuje się, jeśli drugi rzeczywiście jest wymieniony, zostało usunięte. – tadman

Powiązane problemy