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不会产生任何内容。