Ruby do / end vs braces
为什么这个地图表达式会产生不同的结果,具体取决于我是使用大括号还是执行/结束?
a = [1,2,3,4,5] p a.map { |n| n*2 } #=> [2,4,6,8,10] p a.map do |n| n*2 end #=> [1,2,3,4,5]
那是因为第二行被解释为:
p(a.map) do ... end
代替:
p(a.map do ... end)
在这种情况下,语法是模糊的,并且似乎没有像{
一样强烈地绑定。
这与{
character和do
关键字的相关性差异有关。
在第一种情况下,块被解释为map
函数的块参数。 map函数的结果是p
函数的参数。
在第二种情况下,块被解释为p
函数的块参数,而a.map
被解释为p
函数的第一个参数。 由于a.map
计算结果为a
,因此会打印原始数组。 在这种情况下,该块被有效地忽略。
使用do/end
语法,您将块作为第二个参数传递给p
,而不是传递给映射。 你得到相同的结果:
p a.map
p
会忽略该块,因为它在inspect
不会产生任何内容。