2012-11-30 21 views
7

Xin lỗi cho tiêu đề, tôi không biết cú pháp này được gọi như thế nào.Tại sao mã này không được biên dịch trên ruby ​​1.9 nhưng là trên ruby ​​1.8?

Ví dụ:

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

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

của 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]] 

Tôi không yêu cầu cho một cách để có được những mảng truy nã.

Tôi muốn biết lý do tại sao đoạn mã này hoạt động là một trong các phiên bản của Ruby nhưng không phải là cả hai.

Trả lời

5

Trong khi nói chung Ruby 1.9 có nhiều ưu điểm hơn về dấu phẩy trong danh sách và biểu diễn giống như danh sách so với các phiên bản trước, có một số trường hợp mới xảy ra lỗi cú pháp. Điều này có vẻ là một. Ruby 1.9 xử lý điều này đúng như định nghĩa phương thức và sẽ không cho phép dấu phẩy đi lạc đó.

Bạn cũng dường như chạy lên chống lại một lỗi cạnh trong Ruby 1.8.7 đã được sửa chữa. Phương pháp mở rộng danh sách dường như không hoạt động với chỉ một mục.

Khắc phục nhanh trong trường hợp này có thể là:

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

Trong trường hợp này _ chức năng như là một biến bất cứ điều gì.

Trong cả hai phiên bản bạn sẽ nhận được:

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

Nếu dấu phẩy dấu là cần thiết trong 'của Ruby 1.8', điều đó có nghĩa là có một số loại quy tắc đó biến mất? – oldergod

+1

Tôi không nghĩ rằng nó là cần thiết rất nhiều vì nó phụ bước vấn đề. Toàn bộ ngữ nghĩa đối số khối có một đại tu khổng lồ trong 1.9. Đối số tùy chọn với mặc định và '* args' loại catch-alls hiện được hỗ trợ. Hành vi kỳ quặc này của việc không cho phép một danh sách với một mục, nhưng không quan tâm liệu danh sách thứ hai có thực sự được đặt tên dường như đã bị xóa hay không. – tadman