Метод Ruby Gsub - принимать хэш? - PullRequest
5 голосов
/ 03 мая 2011

Предполагается, что метод Ruby gsub string принимает хеш. Как написано здесь:

http://www.ruby -doc.org / ядро ​​/ классов / String.html # M001185

"Если вторым аргументом является Hash, а сопоставленный текст является одним из его ключей, соответствующее значение является строкой замены."

Они приводят пример:

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

Проблема в том, что у меня это не работает (ruby 1.8.7):

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

Это происходит для точно такой же строки. Почему?

Ответы [ 5 ]

8 голосов
/ 03 мая 2011

Это потому, что документ, который упоминает OP, предназначен для ruby 1.9.2. Для ruby 1.8.7 см. http://www.ruby -doc.org / core-1.8.7 / classes / String.html # M000792 ; там gsub метод не принимает хэш в качестве параметра.

UPDATE: Вы можете добавить эту функцию в свой код:

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*"
3 голосов
/ 03 мая 2011

Это особенность Ruby 1.9.

Документация Ruby 1.8.7 не упоминает об этом: http://www.ruby -doc.org / core-1.8.7 / classes / String.html

1 голос
/ 25 февраля 2012
"hello".gsub( /([eo])/ ){ {'e' => 3, 'o' => '*'}[$1] }
0 голосов
/ 26 сентября 2011

Добавьте это к классу 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
0 голосов
/ 04 мая 2011

Возможно, вы захотите посмотреть, включит ли backports функциональность 1.9.2 в 1.8.7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...