为什么Ruby需要.call进行Proc调用?

时间:2009-12-25 20:18:58

标签: ruby syntax

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

为什么不只是proc(args)?为什么要区分函数,lambda和块?基本上,这都是一样的,为什么这个令人困惑的语法呢?或者有什么意义,我没有意识到?

3 个答案:

答案 0 :(得分:11)

需要以某种方式区分调用 Proc传递

在Python和ECMAScript中,它很简单:用括号表示它是一个调用,没有它。在Ruby中,不用括号是也是一个调用,因此,必须有一些其他方法来区分。

在Ruby 1.8中,Proc#call及其别名Proc#[]提供了这种区别。从Ruby 1.9开始,有一个新的允许方法名称(),它被称为obj.(),而Proc#() 也是 Proc#call的别名

所以,你可以这样叫Proc

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

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

BTW:同样的问题也是你必须使用method方法获取方法对象的原因。

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

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