如何替换字符串中的字符

我有一个方法,我想用它来替换字符串中的字符:

def complexity_level_two replacements = { 'i' => 'eye', 'e' => 'eei', 'a' => 'aya', 'o' => 'oha'} word = "Cocoa!55" word_arr = word.split('') results = [] word_arr.each { |char| if replacements[char] != nil results.push(char.to_s.gsub!(replacements[char])) else results.push(char) end } end 

我想要的字符串输出应该是: Cohacohaa!55

但是,当我运行此方法时,它不会替换字符,只输出字符串:

 C o c o a ! 5 5 

我在做什么错误,这个方法不会替换字符串中的正确字符以匹配hash中的字符,如何解决这个问题以获得所需的输出?

 replacements = { 'i' => 'eye', 'e' => 'eei', 'a' => 'aya', 'o' => 'oha'} word = "Cocoa!55" word.gsub(Regexp.union(replacements.keys), replacements) #⇒ "Cohacohaaya!55" 

Regexp::unionString#gsub with hash 。

 replacements = { 'i' => 'eye', 'e' => 'eei', 'a' => 'aya', 'o' => 'oha' }. tap { |h| h.default_proc = ->(h,k) { k } } "Cocoa!55".gsub(/./, replacements) #=> "Cohacohaaya!55" 

请参阅Hash#default_proc =和Object#tap 。

gsub检查字符串的每个字符。 如果replacements将该字符作为键,则该字符将替换为替换中该键的值; else(由于默认的proc),字符被替换为自身(即保持不变)。

另一种方法是使用Hash #fetch :

 replacements = { 'i' => 'eye', 'e' => 'eei', 'a' => 'aya', 'o' => 'oha' } "Cocoa!55".gsub(/./) { |s| replacements.fetch(s) { |c| c } } #=> "Cohacohaaya!55" 

对于Ruby v2.2 +(当Object#本身首次亮相时),可以编写

 "Cocoa!55".gsub(/./) { |s| replacements.fetch(s, &:itself) } 

你可以尝试这样做:

 my_subs = { 'i' => 'eye', 'e' => 'eei','a' => 'aya', 'o' => 'oha' } my_word = "Cocoa!55" my_word.split('').map{|i| my_subs[i] || i}.join 

>“Cohacohaaya!55”

构建方法

使用wordsubs参数定义方法:

 def char_replacer word, subs word.chars.map { |c| subs.key?(c) ? subs[c] : c }.join end 

在这里,我们使用了三元运算符,它本质上是一个更紧凑forms的if-else表达式。 需要注意的关键方法是String#charsArray#mapHash#key? ,请参阅ruby-docs以获取有关这些内容的更多信息。 现在设置完所有,您可以调用您的方法传递一个单词字符串和您选择的子哈希。

例1

 my_subs = { 'i' => 'eye', 'e' => 'eei','a' => 'aya', 'o' => 'oha' } my_word = "Cocoa!55" char_replacer my_word, my_subs #=> "Cohacohaaya!55" 

例2

 my_subs = { 'a' => 'p', 'e' => 'c' } my_word = "Cocoa!55" char_replacer my_word, my_subs #=> "Cocop!55"