Ruby为什么对这两个表达式进行不同的计算?唯一的不同是{...}和do ... end

时间:2018-09-07 15:10:31

标签: arrays ruby enumerator

此表达式:

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在第二种情况下会看到枚举数,而不是映射数组?

1 个答案:

答案 0 :(得分:1)

优先级很重要。 {}优先于方法调用。 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 })

在后一种情况下,传递到pp的块是NOOP