Яка різниця між tr і gsub?


133

Я читав документацію Ruby і заплутався в різниці між gsubі tr. Яка різниця між ними?


8
Я знайшов це питання тому, що RuboCop попередив про моє використання gsub - я думаю, що відповіді нижче пояснюють відповідь добре, що в основному в чому різниця між gsub і tr.
ДжонК

Відповіді:


180

Використовуйте, trколи ви хочете замінити (перекласти) окремі символи.

trзбігається на окремих символах (не через регулярний вираз), тому символи не повинні виникати в одному порядку в аргументі першого рядка. Коли символ знайдений, він замінюється символом, який знаходиться в тому ж індексі у другому рядковому аргументі:

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

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

Використовуйте, gsubколи вам потрібно використовувати регулярний вираз або коли ви хочете замінити більш довгі підрядки:

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

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

48
Біт контексту: назва trозначає "перекласти", як у "перекладі символів", саме це і робиться. Він названий на честь однойменної утиліти Unix (які добре відомі своїми незрозумілими та короткими назвами).
Мартін Турноїй

40
  • trможе замінити один символ лише одним фіксованим символом (хоча ви можете поставити декілька відповідностей подібного типу в один trдзвінок), але це швидко.
  • gsubможе співставити складні шаблони за допомогою регулярного вираження та замінити складним результатом обчислення, але повільніше, ніж tr.

9
Це вірно. Коли обидві працюють trв кілька разів швидше, ніж gsub. Ось орієнтир щодо того, як швидко trможна було б пройти gsub. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu

9

trповертає копію strсимволів, from_strзамінених відповідними символами в to_str. Якщо to_strвона коротша from_str, то вона підтримується останнім символом для підтримки кореспонденції. http://apidock.com/ruby/String/tr

gsubповертає копію strз усіма явищами шаблону, заміщеними другим аргументом. Шаблон зазвичай є Regexp; якщо дано як String, будь-які метахарактеристики регулярних виразів, які він містить, будуть інтерпретуватися буквально, наприклад \d, відповідатиме зворотній реакції, після якої dзамість цифри. http://apidock.com/ruby/String/gsub

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.