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
这是、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、。