调用Enumerable#reduce时我到底在做什么?

时间:2012-08-03 00:33:45

标签: ruby coding-style whitespace irb

为什么我不能在没有括号的情况下调用Enumerable#reduce(sym),如下所示?

>> [1, 2, 3].reduce :+
?>

使用括号时会产生以下结果:

>> [1, 2, 3].reduce(:+)
=> 6

我是否不小心打电话给Enumerable#reduce {| memo, obj | block }

此外,为什么会发生这种情况?

>> [1, 2, 3].reduce &:+
?> ^C
>> [1, 2, 3].reduce(&:+)
=> 6

非常感谢!

2 个答案:

答案 0 :(得分:7)

这似乎是IRb解析器中的错误。如果您在Pry中,或在命令行或文件中尝试它,它可以正常工作:

ruby -e"res = [1, 2, 3].reduce :+
p res"
# 6

基本上,IRb感到困惑,认为+是二元运算符并且正在等待第二个操作数。

答案 1 :(得分:0)

似乎Ruby解析器无法处理该特定组合。符号有局限性,但:+等是某种特殊情况,显然需要括号才能正确解释。

请注意,如果您尝试单独评估:+,则它不会解析。对于:*:/这样的其他运营商也是如此,所以这里有一些“神奇”的东西。