ruby - 将符号传递给 block 方法

标签 ruby syntax block symbols

inject 等一些 block 方法可以选择使用符号而不是 block :

%w[a b c].inject(&:+)
# => "abc"
%w[a b c].inject(:+)
# => "abc"
%w[a b c].inject("", :+)
# => "abc"

map 等其他 block 方法不能:

%w[a b c].map(&:upcase)
# => ["A", "B", "C"]
%w[a b c].map(:upcase)
# => ArgumentError: wrong number of arguments (1 for 0)

为什么后者不能带符号?

最佳答案

对于 inject, block (或替代 block )是必需的。如果它没有传递一个 block ,那么必须至少有一个参数,最后一个参数必须是一个符号,并且 block 将由它构成。无论如何,都没有歧义;最后一个参数用于在缺少 block 时构造 block 。

对于map, block 是可选的。如果没有给出 block ,则返回值将是一个 Enumerator 实例。因此,从一个 block 是否被传递的信息中,不能决定是否应该使用最后一个参数来构造一个 block 。

map 的特殊情况下,它不带参数,所以说一个额外的参数应该被当作一个 block 是有道理的,但是判断是否最后一个参数将根据 arity 被视为一个 block 。并且也失去了 future 改变方法元数的可能性。

关于ruby - 将符号传递给 block 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23193505/

相关文章:

ruby-on-rails - 安装 minitest rails 后,rake test 没有做任何事情

.net - IronRuby - .NET 4.0 - 方法名称末尾的问号和感叹号

syntax - Erlang 函数重载

Python 线程似乎无缘无故停止/卡住/挂起?可能的原因?

html - 如何在一个 DIV 中重叠两张图像?

ruby - 当我将 ruby​​ 更新到 2.0.0-p0 时,我的 vim 无法工作

ruby-on-rails - 运行 ruby​​ 脚本时,Heroku 上的 Ruppell 套接字崩溃(权限被拒绝)

ruby-on-rails - 正则表达式忽略以下划线开头的单词或文件开头的路径

linux - -bash : syntax error near unexpected token `newline' for display command

ios - 如何使用 Swift 语言将数据从弹出的 Model View Controller 传递到前一个 View Controller ?