2012-11-30 4 views
7

제목에 대해 유감스럽게도이 구문이 어떻게 호출되는지 알 수 없습니다. 예를 들어이 코드가 루비 1.9에서 컴파일되지 않고 루비 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] } 
#    ^

루비 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는 이전 버전보다 목록 및 표현 형식의 쉼표에 대해 훨씬 관대하지만 일반적으로 구문 오류가 발생할 수있는 새로운 경우가 있습니다. 이것은 하나 인 것 같습니다. Ruby 1.9는이를 메소드 정의와 같이 엄격하게 취급하며 그 쉼표를 허용하지 않습니다.

또한 해결 된 Ruby 1.8.7의 edge-case 버그에 맞서고있는 것처럼 보입니다. 목록 확장 방법은 하나의 항목에서만 작동하지 않는 것 같습니다.

이 경우 빠른 수정 될 수 있습니다

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

을이 경우에는 어떤 변수로 _ 기능. 두 버전 모두에서

를 당신은 가야 : 후행 쉼표 루비 1.8``에 필요한 경우

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

, 그것은 사라 규칙의 어떤 종류가 있었다 의미합니까? – oldergod

+1

문제가 너무 많이 필요하다고 생각하지 않습니다. 전체 블록 인수 의미론은 1.9에서 대대적 인 개편을 받았습니다. 기본 옵션과'* args' 타입의 catch-alls 옵션 인자가 지원됩니다. 하나의 항목으로 목록을 허용하지 않지만 두 번째 항목이 실제로 명명 된 경우 신경 쓰지 않는이 기발한 동작은 제거 된 것처럼 보입니다. – tadman

관련 문제