web-dev-qa-db-fra.com

Comment remplacer les caractères d'une chaîne

J'ai une méthode que je veux utiliser pour remplacer des caractères dans une chaîne:

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

Ma sortie désirée pour la chaîne devrait être: Cohacohaa!55

Cependant, lorsque j'exécute cette méthode, elle ne remplacera pas les caractères et ne produira que la chaîne:

C
o
c
o
a
!
5
5

Qu'est-ce que je fais mal lorsque cette méthode ne remplacera pas les caractères corrects à l'intérieur de la chaîne pour correspondre à celle de la variable hash et comment puis-je résoudre ce problème pour obtenir le résultat souhaité?

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 avec hash .

14
Aleksei Matiushkin

vous pouvez essayer de faire ceci: 

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"

Voir Hash # default_proc = et Object # tap .

gsub examine chaque caractère de la chaîne. Si replacements a ce caractère comme clé, celui-ci est remplacé par la valeur de cette clé dans replacements; else (à cause du proc par défaut), le caractère est remplacé par lui-même (c'est-à-dire qu'il reste inchangé).

Une autre solution consisterait à utiliser Hash # fetch :

replacements = { 'i' => 'eye', 'e' => 'eei', 'a' => 'aya', 'o' => 'oha' }

"Cocoa!55".gsub(/./) { |s| replacements.fetch(s) { |c| c } }
  #=> "Cohacohaaya!55"

qui, pour Ruby v2.2 + (quand Object # lui-même a fait ses débuts), peut être écrit

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

Construire une méthode

Définissez votre méthode avec Word et subs parameters: 

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

Nous avons utilisé ici l'opérateur ternaire, qui est essentiellement une expression if-else sous une forme plus compacte. Les méthodes clés à noter sont String#chars, Array#map, Hash#key?, voir Ruby-docs pour plus d’informations à leur sujet. Maintenant que tout est configuré, vous pouvez appeler votre méthode en passant un Word string et le subs hash de votre choix.

Exemple 1

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

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

Exemple 2

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

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