Я читал документацию 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