2011-07-28 42 views
8

thể trùng lặp:
Ruby block and unparenthesized argumentscủa Ruby Khối Cú pháp Lỗi

Tôi không chắc là tôi hiểu lỗi cú pháp này. Tôi đang sử dụng Carrierwave để quản lý một số tập tin tải lên trong một ứng dụng Rails, và tôi dường như đi qua một khối đến một trong những phương pháp không chính xác.

Dưới đây là ví dụ trong Carrierwave Docs:

version :thumb do 
    process :resize_to_fill => [200,200] 
end 

Dưới đây là những gì tôi có:

version :full { process(:resize_to_limit => [960, 960]) } 
version :half { process(:resize_to_limit => [470, 470]) } 
version :third { process(:resize_to_limit => [306, 306]) } 
version :fourth { process(:resize_to_limit => [176, 176]) } 

Ở trên không làm việc, tôi nhận được syntax error, unexpected '}', expecting keyword_end. Điều thú vị là đủ, các công việc sau một cách hoàn hảo:

version :full do process :resize_to_limit => [960, 960]; end 
version :half do process :resize_to_limit => [470, 470]; end 
version :third do process :resize_to_limit => [306, 306]; end 
version :fourth do process :resize_to_limit => [176, 176]; end 

Vì vậy, câu hỏi của tôi là, tại sao tôi có thể vượt qua một khối sử dụng do...end nhưng không phải niềng răng trong trường hợp này?

Cảm ơn!

+0

Đây là một bản sao của [Mã khối thông qua cho 'each' làm việc với dấu ngoặc nhưng không phải với' do' -'end' (ruby)] (http://StackOverflow.Com/q/6718340/), [Block definition - sự khác biệt giữa niềng răng và 'do'-'end'?] (http://StackOverflow.Com/q/6179442 /), [Ruby multiline block không có 'do'' end'] (http://StackOverflow.Com/q/3680097/), [Sử dụng 'do' block vs brackets' {} '] (http: // StackOverflow.Com/q/2122380/), [Sự khác nhau hoặc giá trị của các kiểu mã hóa khối này trong Ruby là gì?] (Http://StackOverflow.Com/q/533008/) và [khối Ruby và các đối số không được hiển thị] (http : //StackOverflow.Com/q/420147/). –

Trả lời

14

Hãy thử điều này:

version(:full) { process(:resize_to_limit => [960, 960]) } 
version(:half) { process(:resize_to_limit => [470, 470]) } 
version(:third) { process(:resize_to_limit => [306, 306]) } 
version(:fourth) { process(:resize_to_limit => [176, 176]) } 

Bạn có một vấn đề ưu tiên. Khối { } gắn chặt hơn khối do...end và chặt hơn so với cuộc gọi phương thức; kết quả là Ruby nghĩ rằng bạn đang cố gắng cung cấp một khối như một đối số cho một biểu tượng và nói không.

Bạn có thể xem rõ ràng hơn hoặc ví dụ có thể familar hơn bằng cách so sánh như sau (?):

[1, 2, 3].inject 0 { |x, y| x + y } 
[1, 2, 3].inject(0) { |x, y| x + y } 
+0

Đó là chính xác. Cảm ơn bạn đã giải thích nhanh! – Andrew