В чем разница между tr и gsub?

133

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

жестяной человек
источник
8
Я нашел этот вопрос, потому что RuboCop предупредил о моем использовании gsub - я думаю, что приведенные ниже ответы хорошо объясняют ответ, в чем, по сути, разница между gsub и tr.
JohnK

Ответы:

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"
Spickermann
источник
48
Немного контекста: название trозначает «переводить», как в «переводить символы», что и делает. Он назван в честь одноименной утилиты Unix (которая хорошо известна своими непонятными и короткими именами).
Martin Tournoij
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

Joel
источник