Если символы, которые вы хотите удалить, всегда являются одними и теми же символами, тогда рассмотрите chomp
:
'abc123'.chomp('123') # => "abc"
Преимущества chomp
: отсутствие подсчета, и код более четко сообщает, что это
Без аргументов chomp
удаляет окончание строки DOS или Unix, если они присутствуют:
"abc\n".chomp # => "abc"
"abc\r\n".chomp # => "abc"
Из комментариев быловопрос о скорости использования #chomp
в сравнении с использованием диапазона.Вот эталонный тест, сравнивающий их:
require 'benchmark'
S = 'asdfghjkl'
SL = S.length
T = 10_000
A = 1_000.times.map { |n| "#{n}#{S}" }
GC.disable
Benchmark.bmbm do |x|
x.report('chomp') { T.times { A.each { |s| s.chomp(S) } } }
x.report('range') { T.times { A.each { |s| s[0...-SL] } } }
end
Результаты тестов (с использованием CRuby 2.13p242):
Rehearsal -----------------------------------------
chomp 1.540000 0.040000 1.580000 ( 1.587908)
range 1.810000 0.200000 2.010000 ( 2.011846)
-------------------------------- total: 3.590000sec
user system total real
chomp 1.550000 0.070000 1.620000 ( 1.610362)
range 1.970000 0.170000 2.140000 ( 2.146682)
Таким образом, chomp быстрее чем использование диапазона, на ~ 22%.