Я читав документацію Ruby і заплутався в різниці між gsubі tr. Яка різниця між ними?
Я читав документацію Ruby і заплутався в різниці між gsubі tr. Яка різниця між ними?
Відповіді:
Використовуйте, trколи ви хочете замінити (перекласти) окремі символи.
trзбігається на окремих символах (не через регулярний вираз), тому символи не повинні виникати в одному порядку в аргументі першого рядка. Коли символ знайдений, він замінюється символом, який знаходиться в тому ж індексі у другому рядковому аргументі:
'abcde'.tr('bda', '123')
#=> "31c2e"
'abcde'.tr('bcd', '123')
#=> "a123e"
Використовуйте, gsubколи вам потрібно використовувати регулярний вираз або коли ви хочете замінити більш довгі підрядки:
'abcde'.gsub(/bda/, '123')
#=> "abcde"
'abcde'.gsub(/b.d/, '123')
#=> "a123e"
trозначає "перекласти", як у "перекладі символів", саме це і робиться. Він названий на честь однойменної утиліти Unix (які добре відомі своїми незрозумілими та короткими назвами).
trможе замінити один символ лише одним фіксованим символом (хоча ви можете поставити декілька відповідностей подібного типу в один trдзвінок), але це швидко.gsubможе співставити складні шаблони за допомогою регулярного вираження та замінити складним результатом обчислення, але повільніше, ніж tr.trв кілька разів швидше, ніж gsub. Ось орієнтир щодо того, як швидко trможна було б пройти gsub. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
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