Ruby块语法错误

可能重复:
Ruby块和非私有的参数

我不确定我是否理解这个语法错误。 我正在使用Carrierwave在Rails应用程序中pipe理一些file upload,而且我似乎正在错误地将一个块传递给其中一个方法。

以下是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来传递一个块,但在这种情况下不能使用大括号?

谢谢!

尝试这个:

 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认为你正在试图提供一个块作为一个符号的参数,并说不。

通过比较以下内容,您可以看到一个更清晰的(?)或可能更为亲密的示例:

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