Подтвердить что ты не робот

Как заменить строку значением хэш-коллекции в Ruby?

У меня есть хэш-коллекция: my_hash = {"1" => "apple", "2" => "bee", "3" => "cat"}

Какой синтаксис я бы использовал, чтобы заменить первое вхождение key на хэш-коллекцию value в строке?

например, моя строка ввода: str = I want a 3

Результирующая строка: str = I want a cat

4b9b3361

Ответ 1

Мой один лайнер:

hash.each { |k, v| str[k] &&= v }

или используя метод String#sub!:

hash.each { |k, v| str.sub!(k, v) }

Ответ 2

"I want a %{b}" % {c: "apple", b: "bee", a: "cat"}
=> "I want a bee"

Ответ 3

Предполагая Ruby 1.9 или новее:

str.gsub /\d/, my_hash

Ответ 4

Просто добавьте бесплатное стилирование стиля для ответа fl00r:

my_hash = {"1" => "apple", "2" => "bee", "3" => "cat"}
my_hash.default_proc = Proc.new {|hash, key| key}
str = "I want a 3"
str.gsub(/[[:word:]]+/).each(&my_hash.method(:[]))

Ответ 5

Я не понял вашу проблему, но вы можете попробовать следующее:

my_hash = {"1" => "apple", "2" => "bee", "3" => "cat"}
str = "I want a 3"
str.gsub(/[[:word:]]+/).each do |word|
  my_hash[word] || word
end
#=> "I want a cat"

: D

Ответ 6

my_hash = {"1" => "apple", "2" => "bee", "3" => "cat"}
str = "I want a 3"

Если для строк, которые вы хотите заменить, нет общего шаблона, вы можете использовать:

str.sub /#{my_hash.keys.map { |s| Regexp.escape s }.join '|'}/, my_hash

Но если он есть, код становится намного проще, например:

str.sub /[0-9]+/, my_hash

Если вы хотите заменить все вхождения, а не только первый, используйте gsub.

Ответ 7

Вы можете использовать String.sub в ruby ​​1.9:

string.sub(key, hash[key])

Ответ 8

Следующий код заменит первое вхождение key на хэш-коллекцию value в данной строке str

 str.gsub(/\w+/) { |m| my_hash.fetch(m,m)}
    => "I want a cat"