【问题标题】:What am I actually doing when calling Enumerable#reduce?调用 Enumerable#reduce 时我实际上在做什么?
【发布时间】:2012-08-03 00:33:45
【问题描述】:

为什么我不能在没有括号的情况下调用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

非常感谢!

【问题讨论】:

    标签: ruby coding-style whitespace irb


    【解决方案1】:

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

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

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

    【讨论】:

    • +1 我不知道有 Pry 这样的东西。另外,我没想过从文件中检查它。谢谢!
    • 注意:我最初以res = [1, 2, 3].reduce :+; p res 为例,但事实证明 IRb 可以处理得很好。它需要换行符来触发错误。
    • 我之前尝试过res = [1, 2, 3].reduce :+;,但它只是给了我?> 提示。我没想到之后再输入p res
    • 目前,Pry 基本上是一个更快、更好、更强大、更有特色、更好维护、积极开发的 IRb 替代品。然而,它的真正目标是演变成 Smalltalk/Lisp 风格的交互式开发体验/IDE。它已经具有一些交互式探索功能,例如你可以cd 到一个对象和ls 它的实例变量,你可以显示文档或方法的源代码等。
    【解决方案2】:

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

    请注意,如果您尝试评估 :+ 本身,它不会解析。 :*:/ 等其他运算符也是如此,所以这里发生了一些“神奇”的事情。

    【讨论】:

    • Ruby 的解析器处理得很好。问题在于 IRb 的解析器,它基本上是 Regexps 管道胶带的大杂烩,用于解析一些希望但不完全类似于 Ruby 语言的东西。 Pry 使用 YARV、JRuby 或 Rubinius 的内置解析器,根据定义,这始终是正确的。
    • 那会是一个更合理的解释。我以前从未见过 irb 与 Ruby 解释器的差异如此之大,但话又说回来,我是括号的忠实粉丝。
    猜你喜欢
    • 2014-09-03
    • 2011-08-07
    • 1970-01-01
    • 2019-10-25
    • 2013-06-02
    • 2020-11-21
    • 2015-02-26
    • 2017-06-29
    • 2013-06-13
    相关资源
    最近更新 更多