Eu estava lendo a documentação do Ruby e fiquei confuso com a diferença entre gsub
e tr
. Qual é a diferença entre os dois?
Eu estava lendo a documentação do Ruby e fiquei confuso com a diferença entre gsub
e tr
. Qual é a diferença entre os dois?
Respostas:
Use tr
quando desejar substituir (traduzir) caracteres únicos.
tr
corresponde a caracteres únicos (não por meio de uma expressão regular), portanto, os caracteres não precisam ocorrer na mesma ordem no argumento da primeira string. Quando um caractere é encontrado, ele é substituído pelo caractere encontrado no mesmo índice no segundo argumento da string:
'abcde'.tr('bda', '123')
#=> "31c2e"
'abcde'.tr('bcd', '123')
#=> "a123e"
Use gsub
quando precisar usar uma expressão regular ou quando desejar substituir substrings mais longos:
'abcde'.gsub(/bda/, '123')
#=> "abcde"
'abcde'.gsub(/b.d/, '123')
#=> "a123e"
tr
significa "traduzir", como em "traduzir caracteres", que é exatamente o que faz. É nomeado após o utilitário Unix com o mesmo nome (que é bem conhecido por seus nomes obscuros e abreviados).
tr
só pode substituir um único caractere por um único caractere fixo (embora você possa colocar várias correspondências desse tipo em uma única tr
chamada), mas é rápido.gsub
pode corresponder a padrões complicados usando regex e substituir por um resultado de computação complicado, mas é mais lento que tr
.tr
são várias vezes mais rápidos que gsub
. Aqui está uma referência de quão rápido tr
poderia ser do que gsub
. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
tr
retorna uma cópia de str
com os caracteres from_str
substituídos pelos caracteres correspondentes em to_str
. Se to_str
for menor que from_str
, será preenchido com seu último caractere para manter a correspondência.
http://apidock.com/ruby/String/tr
gsub
retorna uma cópia de str
com todas as ocorrências de padrão substituídas pelo segundo argumento. O padrão é tipicamente um Regexp; se dado como uma String, qualquer metacaractere de expressão regular que ele contém será interpretado literalmente, por exemplo \d
, corresponderá a uma folga seguida por d
, em vez de um dígito.
http://apidock.com/ruby/String/gsub