Qual'è la differenza tra tr e gsub?


133

Stavo leggendo la documentazione di Ruby e mi sono confuso con la differenza tra gsube tr. Qual è la differenza tra i due?


8
Ho trovato questa domanda perché RuboCop ha avvisato del mio uso di gsub: penso che le risposte seguenti spieghino bene la risposta, che è fondamentalmente qual è la differenza tra gsub e tr.
JohnK,

Risposte:


180

Utilizzare trquando si desidera sostituire (tradurre) singoli caratteri.

trcorrisponde 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 gsubquando è necessario utilizzare un'espressione regolare o quando si desidera sostituire sottostringhe più lunghe:

'abcde'.gsub(/bda/, '123')
#=> "abcde"

'abcde'.gsub(/b.d/, '123')
#=> "a123e"

48
Un po 'di contesto: il nome trsignifica "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).
Martin Tournoij

40
  • trpuò sostituire solo un singolo carattere con un singolo carattere fisso (sebbene sia possibile inserire più corrispondenze di questo tipo in una sola trchiamata) ma è veloce.
  • gsubpuò abbinare schemi complicati usando regex e sostituirlo con un risultato di calcolo complicato, ma è più lento di tr.

9
Giusto. Quando entrambe le opere trsono più volte più veloci di gsub. Ecco un punto di riferimento su quanto trpotrebbe essere veloce gsub. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu

9

trrestituisce una copia di strcon i caratteri in from_strsostituiti 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

gsubrestituisce una copia di strcon 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. \dcorrisponderà a un gioco seguito da d, anziché da una cifra. http://apidock.com/ruby/String/gsub

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.