ruby - 为什么 Ruby 需要 .call 来调用 Proc?

标签 ruby syntax

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

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

最佳答案

需要一些方法来区分调用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 方法来获取方法对象的原因。

关于ruby - 为什么 Ruby 需要 .call 来调用 Proc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1961863/

相关文章:

ruby - vim自动缩进Ruby中没有分号的行

scala - 元组的多重赋值是否比多重赋值语句慢?

java - WebView 无法访问代码

java - 如何更新 MySQL 中的多个列(通过 Java)?

syntax - WebStorm/JetBrains : cannot recognize es6 syntax in a . vue文件

ruby - 在数组中查找值

ruby-on-rails - RoR,从模块调用列名

ruby-on-rails - 获取某个时间段内创建的记录

java - ruby 中的条件和迭代器

javascript - 我可以省略所有版本(如果有)的 JavaScript 行尾的每个分号吗?