【发布时间】:2010-12-30 00:45:09
【问题描述】:
我只是想知道在 Ruby 中必须使用 proc.call(args) 调用 Procs 是否有任何充分的理由甚至优势,这使得高阶函数语法更加冗长且不那么直观。
为什么不只是proc(args)?为什么要区分函数、lambda 和块?基本上,它们都是一样的,那么为什么会出现这种令人困惑的语法呢?还是我没有意识到这有什么意义?
【问题讨论】:
我只是想知道在 Ruby 中必须使用 proc.call(args) 调用 Procs 是否有任何充分的理由甚至优势,这使得高阶函数语法更加冗长且不那么直观。
为什么不只是proc(args)?为什么要区分函数、lambda 和块?基本上,它们都是一样的,那么为什么会出现这种令人困惑的语法呢?还是我没有意识到这有什么意义?
【问题讨论】:
您需要某种方法来区分调用Proc和传递它。
在 Python 和 ECMAScript 中,这很简单:带括号的是调用,没有括号则不是。在Ruby中,去掉括号也是一个调用,因此,必须有一些other的方法来区分。
在 Ruby 1.8 中,Proc#call 及其别名 Proc#[] 提供了这种区别。从 Ruby 1.9 开始,obj.(arg) 是 obj.call(arg) 的语法糖,Proc#() 也是 Proc#call 的别名。
所以,您可以像这样调用Proc:
您甚至可以为您的自己的类定义()。
顺便说一句:同样的问题也是为什么您必须使用method 方法来获取方法对象。
【讨论】:
在 ruby 中,您可以拥有一个名为 foo 的局部变量和一个方法。假设该方法是私有的,调用它的唯一方法是foo(args)(self.foo(args) 不适用于不能有显式接收器的私有方法)。如果 ruby 允许重载 () 运算符,使得foo(bar) 中的 foo 可以是一个变量,那么当还有一个名为 foo 的局部变量时,就无法调用私有方法 foo。
请注意,使用 define_method 和 method_missing 之类的功能,并非总是可以避免方法和局部变量同名的情况。
【讨论】:
您希望能够在调用它的情况下传递它,对吗?要求显式调用它允许这样做。否则,每次你尝试使用 proc 作为参数时,你最终都会调用它。
【讨论】:
proc,或者只是传递闭包,和proc作为同义词proc().