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.
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:
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.
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
Odpowiedzi:
Użyj,
tr
gdy chcesz zamienić (przetłumaczyć) pojedyncze znaki.tr
dopasowuje 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,
gsub
gdy 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"
źródło
tr
oznacza „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).tr
może zastąpić tylko jeden znak jednym stałym znakiem (chociaż można umieścić wiele dopasowań tego rodzaju w jednymtr
wywołaniu), ale jest szybki.gsub
może dopasować skomplikowane wzorce przy użyciu wyrażenia regularnego i zastąpić skomplikowanym wynikiem obliczenia, ale jest wolniejsze niżtr
.źródło
tr
są kilkakrotnie szybsze niżgsub
. Oto punkt odniesienia, jak szybkotr
może być niżgsub
. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…tr
zwraca kopięstr
ze znakami wfrom_str
zastąpionymi odpowiednimi znakami wto_str
. Jeślito_str
jest krótszy niżfrom_str
, jest dopełniany ostatnim znakiem w celu zachowania korespondencji. http://apidock.com/ruby/String/trgsub
zwraca kopięstr
ze 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.\d
dopasują odwrót, po którym nastąpid
zamiast cyfry. http://apidock.com/ruby/String/gsubźródło