Arrays 为什么Ruby对这两个表达式的求值不同?唯一的区别是{…}和do…end

Arrays 为什么Ruby对这两个表达式的求值不同?唯一的区别是{…}和do…end,arrays,ruby,enumerator,Arrays,Ruby,Enumerator,这句话: pp [1, 2, 3].map { |r| r+1 } pp [1, 2, 3].map do |r| r+1 end 评估结果为: [2, 3, 4] => [2, 3, 4] #<Enumerator: ...> => #<Enumerator: [1, 2, 3]:map> 正如所料。然而,这句话: pp [1, 2, 3].map { |r| r+1 } pp [1, 2, 3].map do |r| r+1 end 评

这句话:

pp [1, 2, 3].map { |r| r+1 }
pp [1, 2, 3].map do |r|
  r+1
end
评估结果为:

[2, 3, 4]
=> [2, 3, 4]
#<Enumerator: ...>
=> #<Enumerator: [1, 2, 3]:map>
正如所料。然而,这句话:

pp [1, 2, 3].map { |r| r+1 }
pp [1, 2, 3].map do |r|
  r+1
end
评估结果为:

[2, 3, 4]
=> [2, 3, 4]
#<Enumerator: ...>
=> #<Enumerator: [1, 2, 3]:map>
#
=> #

为什么pp在第二种情况下看到的是枚举数,而不是映射数组?

优先级很重要<代码>{}的优先级高于方法调用<代码>执行-
结束
的优先级较低

pp [1, 2, 3].map { |r| r + 1 }
解析为
pp([1,2,3].map{r|r+1})
,即:

pp([1, 2, 3].map { |r| r + 1 })
pp([1, 2, 3].map, &->(r){ r + 1 })

解析为
(pp[1,2,3].map)do | r | r+1 end
,即:

pp([1, 2, 3].map { |r| r + 1 })
pp([1, 2, 3].map, &->(r){ r + 1 })
在后一种情况下,将块传递给
pp
是一个
NOOP

这是、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、。