9

可能重复:
Ruby 块和未加括号的参数

我不确定我是否理解这个语法错误。我正在使用 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在这种情况下我可以使用而不是大括号传递一个块?

谢谢!

4

1 回答 1

16

试试这个:

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 }
于 2011-07-28T05:08:02.663 回答