2011-07-28 54 views
8

可能重複:
Ruby block and unparenthesized arguments紅寶石塊語法錯誤

我不知道我理解這個語法錯誤。我正在使用Carrierwave在Rails應用程序中管理一些文件上傳,而且我似乎正在錯誤地將某個塊傳遞給其中一種方法。

這裏是在Carrierwave Docs的例子:

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

這裏是我有什麼:

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]) } 

以上不工作,我得到syntax error, unexpected '}', expecting keyword_end。有趣的是,以下的作品完美:

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 

所以,我的問題是,爲什麼我可以通過使用do...end但不是大括號在這種情況下塊?

謝謝!

+0

這是[代碼塊傳遞給'each'與括號工作的重複,但不能以'do' (紅寶石)](http://StackOverflow.Com/q/6718340/),[塊定義 - 大括號和'''''''end'之間的區別?](http://StackOverflow.Com/q (http://stackOverflow.Com/q/3680097/),[使用'do'塊vs括號'{}'](http:///StackOverflow.Com/q/2122380/),[Ruby中這些塊編碼風格的區別或價值是什麼?](http://StackOverflow.Com/q/533008/)和[Ruby塊和未加密的參數](http ://StackOverflow.Com/q/420147/)。 –

回答

14

試試這個:

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]) } 

你有一個優先問題。 { }塊的綁定比do...end塊更緊密,並且比方法調用更緊密;結果是Ruby認爲你試圖提供一個塊作爲符號的參數,並說不。

你可以看到更清晰或通過比較可能更familar例如,下面的(?):

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

就是這樣。感謝您的快速解釋! – Andrew