如何替换字符串中的字符。

19

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

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

我期望的字符串输出应该是:Cohacohaaya!55

然而,当我运行这个方法时,它不会替换字符,只输出字符串:

C
o
c
o
a
!
5
5

我在做什么错误的事情,导致这个方法不能替换字符串中的正确字符以匹配hash中的字符?我该如何修复这个问题以获得期望的输出?
4个回答

35

3
我对此有些困惑,这是什么意思? - User9123
1
不错,我从来没有见过 gsub(pattern, hash)。不过你应该编辑一下关于 gsub with block 的评论。 - Eric Duminil

1

构建一个方法

使用 wordsubs 参数定义您的方法:

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

在这里,我们使用了三元运算符,它实际上是一种更紧凑形式的if-else表达式。需要注意的关键方法有String#charsArray#mapHash#key?,请参阅ruby-docs以获取更多信息。现在,设置好所有东西后,您可以调用您的方法,传递一个word字符串和您选择的subs哈希。
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"

1
不必使用三元运算符,可以简单地使用 subs[c] || c - Aleksei Matiushkin
@mudasobwa 啊,是的,好多了。 - Sagar Pandya

1
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中有该字符作为键,则将该字符替换为replacements中该键的值;否则(由于默认过程),该字符将被替换为它本身(即不变)。

另一种方法是使用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#itself 出现时),可以写成:

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

1
你可以尝试这样做:

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"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接