2012-01-04 7 views
1

次のコードが{ブラケット}コードの内容を出力しますが、 "do"コードを出力しない理由についてのご意見はありますか?DOエンドループを使用するとランダムな列挙型エラーが発生する

my_array = ["alpha", "beta", "gamma"] 
puts my_array.collect { 
    |word| 
    word.capitalize 
} 
puts "======================" 
puts my_array.collect do |word| word.capitalize end 
puts "=========END==========" 

コードを実行出力

Alpha 
Beta 
Gamma 
====================== 
#<Enumerator:0x2517ed0> 
====================== 

任意およびすべてのヘルプ理解されるように以下を返します。

答えて

2

do ... end{}ブロック構文が異なる優先順位を持つ - 中括弧を使用して定義されたブロックは、意図したとおりに、あなたの最初の例が動作する理由ですdo ... endを使用して、1よりもその呼び出し元にタイトバインドします。

編集:精巧なビット:puts my_array.collect {|word| word.capitalize}を使用すると、元の配列の各項目を大文字にした結果の配列my_array.collect {|word| word.capitalize}の結果がputsに送信されます。 puts my_array.collect do |word| word.capitalize endを使用する場合は、my_array.collect(列挙子)の値をputsに渡し、ブロックをputsに渡します。 putsはブロックにyieldを持たないので、列挙子の文字列表現を$stdoutに書き込むことになり、ブロックは決して呼び出されません。実際に何が起こっているのかが分かっていない限り、あなたは(このコードを使って作業している人なら誰でも)このようなブロックを使用するときに括弧を使用することをお勧めします。

1

それは、これを評価していますので:

puts my_array.collect 

=> #<Enumerator:0x000001009efce0> 

これを、あなたが意図したとおりに動作します。

puts(my_array.collect do |word| word.capitalize end) 

=> Alpha 
=> Beta 
=> Gamma 

ほとんどの人が数行にわたりdo構文を広げ傾向にあります。

関連する問題