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

Why does Ruby evaluate these two expressions differently? The only difference is {...} and do...end

这个表达式:

pp [1, 2, 3].map { |r| r+1 }

评估为:

[2, 3, 4]
=> [2, 3, 4]

符合预期。但是,这个表达式:

pp [1, 2, 3].map do |r|
  r+1
end

评估为:

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

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

优先顺序很重要。 {} 比方法调用具有更高的优先级。 do-end 的优先级较低。

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) do |r| r + 1 end,即:

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

在后一种情况下,将块传递给 ppNOOP