9

重複の可能性:
Ruby ブロックと括弧で囲まれていない引数

この構文エラーがよくわかりません。Rails アプリでいくつかのファイルのアップロードを管理するために Carrierwave を使用していますが、メソッドの 1 つにブロックを間違って渡しているようです。

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 に答える