2012-02-16 28 views
19

Đây là mã ví dụ từ sách. Tôi cho rằng nó dành cho Ruby 1.8.Trường hợp biểu hiện khác nhau trong Ruby 1.9?

birthyear = 1986 
    generation = case birthyear 
     when 1946...1963: "Baby boomer" 
     when 1964...1976: "Generation X" 
     when 1977...2012: "new generation" 
     else nil 
    end 

    puts generation 

Tôi chạy nó trên Ruby 1,9, và nhận được thông báo lỗi này:

Untitled 2.rb:12: syntax error, unexpected ':', expecting keyword_then or ',' or ';' or '\n' 
    when 1946...1963: "Baby boomer" 
        ^
Untitled 2.rb:13: syntax error, unexpected keyword_when, expecting $end 
    when 1964...1976: "Generation X" 

Làm thế nào tôi nên thay đổi này?

Trả lời

38

Có một sự thay đổi trong cú pháp giữa 1.8.x và 1.9.x nơi : là hiện không còn được phép:

birthyear = 1986 
generation = case birthyear 
    when 1946...1963 
    "Baby boomer" 
    when 1964...1976 
    "Generation X" 
    when 1977...2012 
    "new generation" 
    else 
    nil 
    end 

puts generation 

Kỹ thuật : đã được thay thế ed by then nhưng đó là một từ khóa tùy chọn nếu bạn sử dụng một dòng mới. Đó là một chút rắc rối để đi và theo dõi các trường hợp mà bạn đã sử dụng cú pháp cũ, vì vậy hy vọng tìm kiếm case là đủ gần.

+0

cảm ơn @tadman, tôi hiểu rồi. –

+7

"Có một thay đổi trong cú pháp giữa 1.8.x và 1.9.x trong đó: bây giờ không còn được phép" - ':' là * không bao giờ * được phép. Đó là * không bao giờ * một phần cú pháp chính thức của Ruby. Đó là * không bao giờ * được ghi lại. Nó đã được thêm vào bộ phân tích cú pháp của MRI vì những lý do chưa biết và nó bị bỏ lại vì sợ rằng một sự thay đổi đối với trình phân tích cú pháp có thể làm hỏng thứ gì đó, nhưng Matz đã * luôn * làm cho nó * rất rõ ràng ':' trong 'case' và' if' các biểu thức là * không * một phần của cú pháp, rằng nó * không được * sử dụng và nó * sẽ * được loại bỏ khỏi trình phân tích cú pháp MRI trong tương lai, mà Koichi Sasada cuối cùng đã làm trong YARV. –

+1

Tôi bắt đầu sử dụng chúng trong phiên bản 1.8.x khá tôn giáo vì chúng dường như là "tiêu chuẩn", ngay cả khi de-facto thay vì chính thức. Đó là một sự thức tỉnh thô lỗ khi 1.9.x kéo hỗ trợ.Ít nhất tôi đã có thể thực hiện một Ruby regexp để sửa mã bị hỏng vào lúc đó. – tadman

0

Có một sai lầm trong puts bạn

puts generation # not "gemeration" 

cũng cố gắng một cái gì đó như thế này:

score = 70 

result = case score 
    when 0..40 then "Fail" 
    when 41..60 then "Pass" 
    when 61..70 then "Pass with Merit" 
    when 71..100 then "Pass with Distinction" 
    else "Invalid Score" 
end 

puts result 
+2

đang Indent với bốn không gian để định dạng thích hợp, hoặc sử dụng lại bọ ve cho mã nội tuyến. – tadman

11

Theo ấn bản thứ 3 của số PickAxe, đó là cố ý.

p 125, Case Expressions:

"Ruby 1,8 cho phép bạn sử dụng một nhân vật đại tràng ở vị trí của từ khóa then này không còn được hỗ trợ."

Ví dụ, với then và không có dòng mới:

birthyear = 1986 
generation = case birthyear 
    when 1946...1963 then "Baby boomer" 
    when 1964...1976 then "Generation X" 
    when 1977...2012 then "new generation" 
    else nil 
end 

puts generation 
4

Bạn chỉ có thể thay thế các dấu hai chấm với bán -colons.

Chỉ cần kiểm tra ví dụ này:

birthyear = 1986 
generation = case birthyear 
    when 1946...1963; "Baby boomer" 
    when 1964...1976; "Generation X" 
    when 1977...2012; "new generation" 
    else nil 
end 

puts generation 

Các dấu chấm phẩy làm việc chính xác giống như một dòng mới trong bối cảnh này, tôi nghĩ.

-2

Đây là cách chính xác để làm điều đó:

score = 70 
result = case score 
    when 0..40 then "Fail" 
    when 41..60 then "Pass" 
    when 61..70 then "Pass with Merit" 
    when 71..100 then "Pass with Distinction" 
    else "Invalid Score" 
end 
puts result 
Các vấn đề liên quan