Stavo leggendo la documentazione di Ruby e mi sono confuso con la differenza tra gsub
e tr
. Qual è la differenza tra i due?
Stavo leggendo la documentazione di Ruby e mi sono confuso con la differenza tra gsub
e tr
. Qual è la differenza tra i due?
Risposte:
Utilizzare tr
quando si desidera sostituire (tradurre) singoli caratteri.
tr
corrisponde a singoli caratteri (non tramite un'espressione regolare), pertanto i caratteri non devono trovarsi nello stesso ordine nel primo argomento stringa. Quando viene trovato un carattere, viene sostituito con il carattere che si trova nello stesso indice nel secondo argomento stringa:
'abcde'.tr('bda', '123')
#=> "31c2e"
'abcde'.tr('bcd', '123')
#=> "a123e"
Utilizzare gsub
quando è necessario utilizzare un'espressione regolare o quando si desidera sostituire sottostringhe più lunghe:
'abcde'.gsub(/bda/, '123')
#=> "abcde"
'abcde'.gsub(/b.d/, '123')
#=> "a123e"
tr
significa "tradurre", come in "tradurre i caratteri", che è esattamente quello che fa. Prende il nome dall'utilità Unix con lo stesso nome (che sono ben noti per i loro nomi oscuri e abbreviati).
tr
può sostituire solo un singolo carattere con un singolo carattere fisso (sebbene sia possibile inserire più corrispondenze di questo tipo in una sola tr
chiamata) ma è veloce.gsub
può abbinare schemi complicati usando regex e sostituirlo con un risultato di calcolo complicato, ma è più lento di tr
.tr
sono più volte più veloci di gsub
. Ecco un punto di riferimento su quanto tr
potrebbe essere veloce gsub
. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
tr
restituisce una copia di str
con i caratteri in from_str
sostituiti dai caratteri corrispondenti in to_str
. Se to_str
è più corto di from_str
, è imbottito con il suo ultimo carattere per mantenere la corrispondenza.
http://apidock.com/ruby/String/tr
gsub
restituisce una copia di str
con tutte le occorrenze del modello sostituito per il secondo argomento. Il modello è in genere un Regexp; se indicato come stringa, qualsiasi metacarattere di espressione regolare che contiene verrà interpretato letteralmente, ad es. \d
corrisponderà a un gioco seguito da d
, anziché da una cifra.
http://apidock.com/ruby/String/gsub