2012-01-04 55 views
1

爲什麼下面的代碼輸出{bracket}代碼的內容而不是「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,這就是爲什麼你的第一個例子中按預期工作。

編輯:詳細闡述了一下:當您使用puts my_array.collect {|word| word.capitalize}時,您發送到putsmy_array.collect {|word| word.capitalize}的結果 - 由原始數組中的每個項目大寫產生的數組。當您使用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語法出了幾行。