使用DO End循环时出现随机枚举器错误

时间:2012-01-04 04:05:18

标签: ruby

有关为什么以下代码输出{bracket}代码而不是“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 个答案:

答案 0 :(得分:2)

do ... end{}块语法具有不同的优先级 - 使用大括号定义的块比使用do ... end的块更紧密地绑定到其调用者,这就是为什么您的第一个示例按预期工作的原因。 / p>

编辑:解决一下:当您使用puts my_array.collect {|word| word.capitalize}时,您正在向puts发送my_array.collect {|word| word.capitalize}的结果 - 通过大写原始数组中的每个项目而产生的数组。当您使用puts my_array.collect do |word| word.capitalize end时,您将my_array.collect(一个枚举数)的值传递给puts,并将该块传递给puts。由于puts没有yield到块,您最终会将枚举器的字符串表示形式写入$stdout,并且块永远不会被调用。因此,在使用这样的块时使用括号是一个好主意,除非你(以及你正在处理代码的任何人!)确切地知道发生了什么。

答案 1 :(得分:1)

因为它正在评估这个:

puts my_array.collect

=> #<Enumerator:0x000001009efce0>

这可以按照您的意图运作:

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

=> Alpha 
=> Beta 
=> Gamma

大多数人倾向于将do语法分散出几行。