2011-07-28 30 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