【问题标题】:Assistance with Some Interesting Syntax in Some Ruby Code I've Found帮助我发现一些 Ruby 代码中的一些有趣的语法
【发布时间】:2010-01-25 04:56:10
【问题描述】:

我目前正在阅读使用 Rails 进行敏捷 Web 开发,第 3 版。在第 672 页,我遇到了这种方法:

def capitalize_words(string)
  string.gsub(/\b\w/) { $&.upcase }
end

块中的代码在做什么?我从未见过这种语法。它类似于array.map(&:some_method) 语法吗?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    它是输入的标题。在块内,$& 是一个内置的表示当前匹配(\b\w 即每个单词的第一个字母),然后大写。

    【讨论】:

      【解决方案2】:

      你谈到了我不喜欢 Ruby 的少数几件事之一:)

      魔术变量 $& 包含上一次成功模式匹配的匹配字符串。所以在这种情况下,它将是每个单词的第一个字符。

      RDoc for String.gsub 中提到了这一点:

      http://ruby-doc.org/core/classes/String.html#M000817

      【讨论】:

      • 正如我所说,我不喜欢 Ruby 的少数几件事之一。希望 Matz 用 Perl 留下魔法变量。
      • 彼得的回答(下)显示了两个更易读的版本,它们都没有使用全局变量。 (或者,更准确地说,该全局变量的任何使用都与String#gsub 将变量传递给块的方式绑定在一起——它如何传递变量取决于 Ruby 实现。)
      【解决方案3】:

      gsub 将正则表达式中匹配的所有内容替换为块的结果。所以是的,在这种情况下,您要匹配单词的第一个字母,然后用大写的版本替换它。

      至于块内稍微奇怪的语法,这是等效的(也许更容易理解):

      def capitalize_words(string)
        string.gsub(/\b\w/) {|x| x.upcase}
      end
      

      甚至更流畅:

      def capitalize_words(string)
        string.gsub /\b\w/, &:upcase
      end
      

      至于正则表达式(由镐书提供),\b 匹配单词边界,\w 匹配任何“单词字符”(字母数字和下划线)。所以\b\w 匹配单词的第一个字符。

      【讨论】:

        猜你喜欢
        • 2020-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多