我只是想知道在Ruby中使用Proc
调用proc.call(args)
是否有任何合理的理由甚至是优势,这使得高阶函数语法更加冗长,更不直观。
为什么不只是proc(args)
?为什么要区分函数,lambda和块?基本上,这都是一样的,为什么这个令人困惑的语法呢?或者有什么意义,我没有意识到?
答案 0 :(得分:11)
您需要以某种方式区分调用 Proc
和传递。
在Python和ECMAScript中,它很简单:用括号表示它是一个调用,没有它。在Ruby中,不用括号是也是一个调用,因此,必须有一些其他方法来区分。
在Ruby 1.8中,Proc#call
及其别名Proc#[]
提供了这种区别。从Ruby 1.9开始,有一个新的允许方法名称()
,它被称为obj.()
,而Proc#()
也是 Proc#call
的别名
所以,你可以这样叫Proc
:
您甚至可以为自己的类定义()
。
BTW:同样的问题也是你必须使用method
方法获取方法对象的原因。
答案 1 :(得分:6)
在ruby中,您可以拥有一个名为foo的局部变量和方法。假设该方法是私有的,调用它的唯一方法是foo(args)
(self.foo(args)
不适用于没有显式接收器的私有方法)。如果ruby允许重载()运算符,那么foo(bar)
中的foo可以是变量,当还有一个名为foo的局部变量时,将无法调用私有方法foo。
请注意,对于define_method
和method_missing
等功能,并不总是可以避免使用同名方法和局部变量的情况。
答案 2 :(得分:2)
你希望能够在没有调用的情况下传递它,对吗?要求明确调用它允许。否则,每次尝试使用proc作为参数时,最终都会调用它。