此表达式:
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在第二种情况下会看到枚举数,而不是映射数组?
答案 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
。