为什么 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 })
在后一种情况下,将块传递给 pp
是 NOOP
。
这个表达式:
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 })
在后一种情况下,将块传递给 pp
是 NOOP
。