【问题标题】:Why does Ruby require .call for Proc invocation?为什么 Ruby 需要 .call 进行 Proc 调用?
【发布时间】:2010-12-30 00:45:09
【问题描述】:

我只是想知道在 Ruby 中必须使用 proc.call(args) 调用 Procs 是否有任何充分的理由甚至优势,这使得高阶函数语法更加冗长且不那么直观。

为什么不只是proc(args)?为什么要区分函数、lambda 和块?基本上,它们都是一样的,那么为什么会出现这种令人困惑的语法呢?还是我没有意识到这有什么意义?

【问题讨论】:

    标签: ruby syntax


    【解决方案1】:

    需要某种方法来区分调用Proc传递它。

    在 Python 和 ECMAScript 中,这很简单:带括号的是调用,没有括号则不是。在Ruby中,去掉括号也是一个调用,因此,必须有一些other的方法来区分。

    在 Ruby 1.8 中,Proc#call 及其别名 Proc#[] 提供了这种区别。从 Ruby 1.9 开始,obj.(arg)obj.call(arg) 的语法糖,Proc#() 也是 Proc#call 的别名。

    所以,您可以像这样调用Proc

    • foo.call(1, 2, 3)
    • foo[1, 2, 3]
    • foo.(1, 2, 3)

    您甚至可以为您的自己的类定义()

    顺便说一句:同样的问题也是为什么您必须使用method 方法来获取方法对象。

    【讨论】:

      【解决方案2】:

      在 ruby​​ 中,您可以拥有一个名为 foo 的局部变量和一个方法。假设该方法是私有的,调用它的唯一方法是foo(args)self.foo(args) 不适用于不能有显式接收器的私有方法)。如果 ruby​​ 允许重载 () 运算符,使得foo(bar) 中的 foo 可以是一个变量,那么当还有一个名为 foo 的局部变量时,就无法调用私有方法 foo。

      请注意,使用 define_methodmethod_missing 之类的功能,并非总是可以避免方法和局部变量同名的情况。

      【讨论】:

      • 要分叉,有一种私有方法,ruby 允许显式接收器: self.foo=(args) ,以区分创建局部变量和调用方法。
      【解决方案3】:

      您希望能够在调用它的情况下传递它,对吗?要求显式调用它允许这样做。否则,每次你尝试使用 proc 作为参数时,你最终都会调用它。

      【讨论】:

      • 展开:在Ruby中,方法调用的括号是可选的,所以解释器无法区分proc,或者只是传递闭包,和proc作为同义词proc().
      猜你喜欢
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多