为什么这个映射表达式会产生不同的结果,这取决于我是使用大括号还是do/end?
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]
发布于 2011-04-01 20:50:54
这是因为第二行被解释为:
p(a.map) do ... end
而不是:
p(a.map do ... end)
在这种情况下,语法是模棱两可的,而且do
似乎不像{
那样绑定得那么强。
发布于 2011-04-01 20:53:57
这与{
字符和do
关键字的关联性不同有关。
在第一种情况下,块被解释为map
函数的块参数。map函数的结果是p
函数的参数。
在第二种情况下,块被解释为p
函数的块参数,而a.map
被解释为p
函数的第一个参数。由于a.map
的计算结果为a
,因此将打印原始数组。在这种情况下,该块实际上被忽略了。
发布于 2011-04-01 20:52:23
使用do/end
语法,您可以将块作为第二个参数传递给p
,而不是传递给映射。您可以使用以下命令获得相同的结果:
p a.map
p
会忽略该块,因为它不会在inspect
上产生任何内容。
https://stackoverflow.com/questions/5513531
复制相似问题