Je lisais la documentation Ruby et je me suis confondu avec la différence entre gsub
et tr
. Quelle est la différence entre les deux?
Je lisais la documentation Ruby et je me suis confondu avec la différence entre gsub
et tr
. Quelle est la différence entre les deux?
Réponses:
À utiliser tr
lorsque vous souhaitez remplacer (traduire) des caractères uniques.
tr
correspond à des caractères uniques (pas via une expression régulière), par conséquent, les caractères n'ont pas besoin de se présenter dans le même ordre dans le premier argument de chaîne. Lorsqu'un caractère est trouvé, il est remplacé par le caractère qui se trouve au même index dans le deuxième argument de chaîne:
'abcde'.tr('bda', '123')
#=> "31c2e"
'abcde'.tr('bcd', '123')
#=> "a123e"
À utiliser gsub
lorsque vous devez utiliser une expression régulière ou lorsque vous souhaitez remplacer des sous-chaînes plus longues:
'abcde'.gsub(/bda/, '123')
#=> "abcde"
'abcde'.gsub(/b.d/, '123')
#=> "a123e"
tr
signifie "traduire", comme dans "traduire les caractères", ce qui est exactement ce qu'il fait. Il porte le nom de l'utilitaire Unix du même nom (qui est bien connu pour ses noms obscurs et courts).
tr
ne peut remplacer qu'un seul caractère par un seul caractère fixe (bien que vous puissiez mettre plusieurs correspondances de ce type en un seul tr
appel) mais est rapide.gsub
peut correspondre à des modèles compliqués à l'aide de regex et remplacer par un résultat de calcul compliqué, mais est plus lent que tr
.tr
sont plusieurs fois plus rapides que gsub
. Voici un point de repère sur la vitesse à laquelle tr
pourrait être gsub
. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
tr
renvoie une copie de str
avec les caractères dans from_str
remplacés par les caractères correspondants dans to_str
. Si to_str
est plus court que from_str
, il est complété avec son dernier caractère afin de maintenir la correspondance.
http://apidock.com/ruby/String/tr
gsub
renvoie une copie de str
avec toutes les occurrences de pattern substituées au second argument. Le modèle est généralement une expression rationnelle; s'il est donné sous forme de chaîne, tout méta-caractère d'expression régulière qu'il contient sera interprété littéralement, par exemple \d
correspondra à un jeu suivi de d
, au lieu d'un chiffre.
http://apidock.com/ruby/String/gsub