有关为什么以下代码输出{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>
======================
任何和所有帮助表示赞赏。
答案 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
语法分散出几行。