@ Sundeep делает важное замечание в комментарии к вопросу.Например, если замены были даны следующим хешем:
g = {'e'=>'ai', 's'=>'es', 'us'=>'mi', 'i' => 'as'}
#=> {"e"=>"ai", "s"=>"es", "us"=>"mi", "i"=>"as"}
'surnamus'
будет преобразовано (неправильно) в 'surnamues'
только потому, что 's'=>'es'
предшествует 'us'=>'mi'
в g
.Такая ситуация может не существовать в настоящее время, но может быть целесообразно учесть это в будущем, особенно потому, что это так просто сделать:
h = g.sort_by { |k,_| -k.size }.to_h
#=> {"us"=>"mi", "e"=>"ai", "s"=>"es", "i"=>"as"}
arr = ['surname', 'surnamus', 'surnami', 'surnamo']
Замены могут быть выполнены с использованием формы String @ # sub , который использует хэш в качестве второго аргумента.
r = /#{Regexp.union(h.keys)}\z/
#=> /(?-mix:us|e|s|i)\z/i
arr.map { |s| s.sub(r,h) }
#=> ["surnamai", "surnammi", "surnamas", "surnamo"]
См. Также Regexp :: union .
Кстати, хотя key-Начиная с Ruby v1.9, порядок вставки был гарантирован для хэшей, продолжаются споры о том, следует ли использовать это свойство в коде Ruby, главным образом потому, что не было понятия порядка ключей, когда хэши впервые использовались в компьютерных программах.Этот ответ является хорошим примером использования порядка ключей.