我有一个方法可以用来替换字符串中的字符:
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
中的字符,以及如何解决此问题以获得所需的输出?
答案 0 :(得分:14)
replacements = {
'i' => 'eye', 'e' => 'eei',
'a' => 'aya', 'o' => 'oha'}
word = "Cocoa!55"
word.gsub(Regexp.union(replacements.keys), replacements)
#⇒ "Cohacohaaya!55"
答案 1 :(得分:1)
使用 word 和 subs 参数定义您的方法:
def char_replacer word, subs
word.chars.map { |c| subs.key?(c) ? subs[c] : c }.join
end
这里我们使用了三元运算符,它本质上是一个更紧凑形式的if-else表达式。需要注意的主要方法有String#chars
,Array#map
,Hash#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"
my_subs = { 'a' => 'p', 'e' => 'c' }
my_word = "Cocoa!55"
char_replacer my_word, my_subs #=> "Cocop!55"
答案 2 :(得分: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
中该键的值; 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#itself首次亮相时),可以写成
"Cocoa!55".gsub(/./) { |s| replacements.fetch(s, &:itself) }
答案 3 :(得分: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"