web-dev-qa-db-de.com

So ersetzen Sie die Zeichen in einer Zeichenfolge

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?

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

Regexp::union , String#gsub mit Hash .

14

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"

1
IDIR GACI
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) }
1
Cary Swoveland

Methode konstruieren

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.

Beispiel 1

my_subs = { 'i' => 'eye', 'e' => 'eei','a' => 'aya', 'o' => 'oha' }
my_Word = "Cocoa!55"

char_replacer my_Word, my_subs #=> "Cohacohaaya!55"

Beispiel 2

my_subs = { 'a' => 'p', 'e' => 'c' }
my_Word = "Cocoa!55"

char_replacer my_Word, my_subs #=> "Cocop!55"
1
Sagar Pandya