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

Dar*_*rio 6 ruby syntax

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

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

Jör*_*tag 11

需要一些方法来区分调用Proc,并通过它周围.

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

在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方法来获取方法对象的原因.


sep*_*p2k 6

在ruby中,您可以拥有一个名为foo的局部变量和方法.假设该方法是私有的,那么调用它的唯一方法是foo(args)(self.foo(args)对于不能有明确接收者的私有方法不起作用).如果ruby允许重载()运算符,那么foo in foo(bar)可以是一个变量,当还有一个名为foo的局部变量时,就没有办法调用私有方法foo.

请注意,对于类似define_method和的功能method_missing,并不总是可以避免使用具有相同名称的方法和局部变量的情况.