Estaba leyendo la documentación de Ruby y me confundí con la diferencia entre gsub
y tr
. ¿Cuál es la diferencia entre los dos?
Estaba leyendo la documentación de Ruby y me confundí con la diferencia entre gsub
y tr
. ¿Cuál es la diferencia entre los dos?
Respuestas:
Úselo tr
cuando desee reemplazar (traducir) caracteres individuales.
tr
coincide con caracteres individuales (no a través de una expresión regular), por lo tanto, no es necesario que los caracteres aparezcan en el mismo orden en el primer argumento de cadena. Cuando se encuentra un carácter, se reemplaza con el carácter que se encuentra en el mismo índice en el segundo argumento de cadena:
'abcde'.tr('bda', '123')
#=> "31c2e"
'abcde'.tr('bcd', '123')
#=> "a123e"
Úselo gsub
cuando necesite usar una expresión regular o cuando desee reemplazar subcadenas más largas:
'abcde'.gsub(/bda/, '123')
#=> "abcde"
'abcde'.gsub(/b.d/, '123')
#=> "a123e"
tr
significa "traducir", como en "traducir caracteres", que es exactamente lo que hace. Lleva el nombre de la utilidad Unix del mismo nombre (que son bien conocidos por sus nombres oscuros y cortos).
tr
solo puede reemplazar un solo carácter con un solo carácter fijo (aunque puede poner múltiples coincidencias de este tipo en una sola tr
llamada) pero es rápido.gsub
puede combinar patrones complicados usando expresiones regulares y reemplazarlos con un resultado de cálculo complicado, pero es más lento que tr
.tr
es varias veces más rápido que gsub
. Aquí hay un punto de referencia sobre qué tan rápido tr
podría ser gsub
. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
tr
devuelve una copia de str
con los caracteres en from_str
reemplazados por los caracteres correspondientes en to_str
. Si to_str
es más corto que from_str
, se rellena con su último carácter para mantener la correspondencia.
http://apidock.com/ruby/String/tr
gsub
devuelve una copia de str
con todas las apariciones de patrón sustituidas por el segundo argumento. El patrón es típicamente un Regexp; Si se da como una Cadena, cualquier metacaracteres de expresión regular que contenga se interpretará literalmente, por ejemplo \d
, coincidirá con una reacción violenta seguida de d
, en lugar de un dígito.
http://apidock.com/ruby/String/gsub