Ich habe eine Methode, die ich verwenden möchte, um Zeichen in einer Zeichenfolge zu ersetzen:
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
Meine gewünschte Ausgabe für den String sollte sein: Cohacohaa!55
Wenn ich diese Methode ausführe, werden die Zeichen jedoch nicht ersetzt und nur die Zeichenfolge ausgegeben:
C
o
c
o
a
!
5
5
Was mache ich falsch, wenn diese Methode nicht die korrekten Zeichen in der Zeichenfolge ersetzt, die mit der in hash
übereinstimmt, und wie kann ich dies beheben, um die gewünschte Ausgabe zu erhalten?
replacements = {
'i' => 'eye', 'e' => 'eei',
'a' => 'aya', 'o' => 'oha'}
Word = "Cocoa!55"
Word.gsub(Regexp.union(replacements.keys), replacements)
#⇒ "Cohacohaaya!55"
sie können versuchen, dies zu tun:
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"
replacements = { 'i' => 'eye', 'e' => 'eei', 'a' => 'aya', 'o' => 'oha' }.
tap { |h| h.default_proc = ->(h,k) { k } }
"Cocoa!55".gsub(/./, replacements)
#=> "Cohacohaaya!55"
Siehe Hash # default_proc = und Object # tap .
gsub
untersucht jedes Zeichen der Zeichenfolge. Wenn replacements
dieses Zeichen als Schlüssel hat, wird das Zeichen durch den Wert dieses Schlüssels in replacements
ersetzt. Andernfalls (aufgrund der Standardprozedur) wird das Zeichen durch sich selbst ersetzt (dh, es bleibt unverändert).
Eine andere Möglichkeit wäre die Verwendung von Hash # fetch :
replacements = { 'i' => 'eye', 'e' => 'eei', 'a' => 'aya', 'o' => 'oha' }
"Cocoa!55".gsub(/./) { |s| replacements.fetch(s) { |c| c } }
#=> "Cohacohaaya!55"
was für Ruby v2.2 + (wenn Object # selbst sein Debüt gemacht hat) geschrieben werden kann
"Cocoa!55".gsub(/./) { |s| replacements.fetch(s, &:itself) }
Definieren Sie Ihre Methode mit den Parametern Word und subs :
def char_replacer Word, subs
Word.chars.map { |c| subs.key?(c) ? subs[c] : c }.join
end
Hier haben wir den ternären Operator verwendet, der im Wesentlichen ein if-else-Ausdruck in einer kompakteren Form ist. Die wichtigsten Methoden, die Sie beachten sollten, sind String#chars
, Array#map
, Hash#key?
, siehe Ruby-docs für weitere Informationen dazu. Nun können Sie Ihre Methode mit einem Word string und dem subs Hash Ihrer Wahl übergeben.
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"