【问题标题】:Ruby gsub method - accepting hash?Ruby gsub 方法 - 接受哈希?
【发布时间】:2012-02-25 15:24:13
【问题描述】:

Ruby 的 gsub 字符串方法应该接受哈希。写在这里:

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

“如果第二个参数是一个Hash,匹配的文本是它的key之一,对应的值就是替换字符串。”

他们举了一个例子:

'hello'.gsub(/[eo]/, 'e' => 3, 'o' => '*')    #=> "h3ll*"

问题是,它不适合我(ruby 1.8.7):

in `gsub': can't convert Hash into String (TypeError)

这发生在完全相同的行上。为什么?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    这是因为 OP 提到的文档是针对 ruby 1.9.2 的。对于ruby 1.8.7,请参考http://www.ruby-doc.org/core-1.8.7/classes/String.html#M000792;在那里,gsub 方法不接受哈希作为参数。

    更新: 您可以将此功能添加到您的代码中:

    class String
      def awesome_gsub(pattern, hash)
        gsub(pattern) do |m| 
          hash[m]
        end
      end
    end
    
    p 'hello'.awesome_gsub(/[eo]/, 'e' => '3', 'o' => '*') #=> "h3ll*"
    

    【讨论】:

    • 很抱歉。谢谢,@ sepp2k。固定。
    【解决方案2】:

    这是 Ruby 1.9 特有的功能。

    Ruby 1.8.7 文档没有提及它:http://www.ruby-doc.org/core-1.8.7/classes/String.html

    【讨论】:

      【解决方案3】:
      "hello".gsub( /([eo])/ ){ {'e' => 3, 'o' => '*'}[$1] }
      

      【讨论】:

      • 这对于 OP 的简单散列来说是复杂的,但如果你有更大的散列,通过一个块可能会有所帮助。
      【解决方案4】:

      您可能想看看backports 是否会在 1.8.7 中启用 1.9.2 功能。

      【讨论】:

        【解决方案5】:

        将此添加到项目的 Hash 类中:

        # replaces recursively old_value by new_value
        def gsub_hash_values(old_value, new_value)
          self.each do |k, v|
            if v.is_a?(Array)
              v.each do |vv|
                vv.gsub!(old_value, new_value)
              end
            elsif v.is_a?(Hash)
              v.gsub_hash_values(old_value, new_value)
            elsif v.respond_to?(:to_s)
             self[k] = v.to_s.gsub(old_value, new_value)
            end
          end
        end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-15
          • 1970-01-01
          • 2012-11-24
          • 2012-04-12
          • 1970-01-01
          • 2013-08-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多