0

これは機能します:

[1, 2].inject({}) do |result, item| end

これも機能します:

[1, 2].inject Hash.new do |result, item| end

これにより、SyntaxErrorがスローされます。

[1, 2].inject {} do |result, item| end

どちらの場合、リテラルをハッシュ{}し、Hash.new互換性がありませんか?

4

1 に答える 1

4
  • オプションのブロックを使用して、任意のメソッドを呼び出すことができます。
  • ブロックはフォームdo |params| ... endまたはフォームを持つことができます{ |params| ... }
    • Rubyコミュニティでは、前者を複数行のブロックに使用し、後者を単一行のブロックに使用するのは慣用句です。
  • ブロックはパラメーターを受け入れる必要はありません。その場合、ブロックは実際にはまたはのいずれかとして表示されdo ... endます{ ... }
  • したがってfoo {}、引数として空のハッシュをとるメソッド、またはまたはfoo({})と同様に空のブロックが渡されるメソッドのいずれかとして解釈できます。Rubyはこれを前者として解釈することを選択します。これにより、例は2つのブロックを取るメソッドとして残りますが、構文的には有効ではありません。foo{ |x| }foo{ nil }

より簡潔なブロック構文に気付いていないように思われるので、次のように使用できます。

squares = [1,2,3,4,5].map{ |x| x*x } #=> [1,4,9,16,25]

そして、これが合法的な空のブロック構文の(あまり役に立たない)例です:

p [1,2,3].map{} #=> [nil,nil,nil]

ブロックにはステートメントがないため、ブロック内の最後の式の値はであり、nilこれにブロック内の各値がマップされます。

于 2013-02-21T19:17:27.047 に答える