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?


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"

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.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.