Jaka jest różnica między tr i gsub?

135

Czytałem dokumentację Rubiego i pomyliłem się z różnicą między gsubi tr. Jaka jest różnica między nimi?

Blaszany Człowiek
źródło
8
Znalazłem to pytanie, ponieważ RuboCop ostrzegł mnie o używaniu gsub - myślę, że poniższe odpowiedzi dobrze wyjaśniają odpowiedź, czyli w zasadzie jaka jest różnica między gsub i tr.
JohnK

Odpowiedzi:

184

Użyj, trgdy chcesz zamienić (przetłumaczyć) pojedyncze znaki.

trdopasowuje do pojedynczych znaków (nie za pośrednictwem wyrażenia regularnego), dlatego znaki nie muszą występować w tej samej kolejności w pierwszym argumencie ciągu. Gdy znak zostanie znaleziony, jest zastępowany znakiem, który znajduje się w tym samym indeksie w drugim argumencie ciągu:

'abcde'.tr('bda', '123')
#=> "31c2e"

'abcde'.tr('bcd', '123')
#=> "a123e"

Użyj, gsubgdy musisz użyć wyrażenia regularnego lub gdy chcesz zamienić dłuższe podciągi:

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

'abcde'.gsub(/b.d/, '123')
#=> "a123e"
spickermann
źródło
49
Odrobina kontekstu: nazwa troznacza „przetłumacz”, tak jak w przypadku „przetłumacz znaki”, co jest dokładnie tym, co robi. Jego nazwa pochodzi od narzędzia Unix o tej samej nazwie (które jest dobrze znane z niejasnych i krótkich nazw).
Martin Tournoij
41
  • trmoże zastąpić tylko jeden znak jednym stałym znakiem (chociaż można umieścić wiele dopasowań tego rodzaju w jednym trwywołaniu), ale jest szybki.
  • gsubmoże dopasować skomplikowane wzorce przy użyciu wyrażenia regularnego i zastąpić skomplikowanym wynikiem obliczenia, ale jest wolniejsze niż tr.
sawa
źródło
10
To prawda. Gdy obie prace trsą kilkakrotnie szybsze niż gsub. Oto punkt odniesienia, jak szybko trmoże być niż gsub. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu
10

trzwraca kopię strze znakami w from_strzastąpionymi odpowiednimi znakami w to_str. Jeśli to_strjest krótszy niż from_str, jest dopełniany ostatnim znakiem w celu zachowania korespondencji. http://apidock.com/ruby/String/tr

gsubzwraca kopię strze wszystkimi wystąpieniami wzorca podstawionymi dla drugiego argumentu. Wzorzec jest zwykle wyrażeniem regularnym; jeśli zostanie podany jako łańcuch, wszystkie zawarte w nim metaznaki wyrażenia regularnego będą interpretowane dosłownie, np. \ddopasują odwrót, po którym nastąpi dzamiast cyfry. http://apidock.com/ruby/String/gsub

Joel
źródło