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