【问题标题】:What exactly is `&:capitalize` in Ruby?Ruby 中的 `&:capitalize` 到底是什么?
【发布时间】:2010-12-20 01:04:51
【问题描述】:

我刚刚阅读了这个答案Converting upper-case string into title-case using Ruby

有下面这行代码

"abc".split(/(\W)/).map(&:capitalize).join

&:capitalize 到底是什么?在我自己将它放入 irb 之前,我会告诉你,它不是有效的 ruby​​ 语法。它必须是某种Proc 对象,因为Array#map 通常会占用一个块。但事实并非如此。如果我把它单独放入 irb,我会得到syntax error, unexpected tAMPER

【问题讨论】:

  • 它在 irb 中对你不起作用的原因可能是因为,就像 sepp2k 所说,它只被嵌入到 Ruby 1.8.7 的标准库中,我猜你正在运行较早的版本。但是,您经常会看到它,因为 ActiveSupport 也将其引入,并且 ActiveSupport 是 Rails 附带的。如果您在 Rails 的脚本/控制台中尝试它,您可能会发现它有效。

标签: ruby syntax


【解决方案1】:

foo(&a_proc_object)a_proc_object 变成一个块并使用该块调用 foo。

foo(&not_a_proc_object)not_a_proc_object 上调用to_proc,然后将to_proc 返回的proc 对象转换为一个块,并使用该块调用foo。

在 ruby​​ 1.8.7+ 和主动支持中,Symbol#to_proc 被定义为返回一个 proc,该 proc 调用由 proc 参数上的符号命名的方法。

【讨论】:

    【解决方案2】:

    这是Symbol#to_proc:见http://pragdave.pragprog.com/pragdave/2005/11/symbolto_proc.html

    map(&:capitalize)map { |x| x.capitalize } 完全相同。

    【讨论】:

    • 不完全一样,因为对前者有性能影响。
    【解决方案3】:

    & 符号是语法糖,它使用to_proc 消息生成一大堆代码。见http://blog.codahale.com/2006/08/01/stupid-ruby-tricks-stringto_proc/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-15
      • 2010-09-17
      • 2017-05-06
      • 2015-07-04
      • 2013-07-06
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      相关资源
      最近更新 更多