Каков предпочтительный способ удаления последних n символов из строки?
Ruby, удалить последние N символов из строки?
Ответ 1
Рубин 2. 5+
 Начиная с Ruby 2.5 вы можете использовать delete_suffix или delete_suffix! чтобы достичь этого в быстрой и удобочитаемой форме.
Документы по методам здесь.
Если вы знаете, что такое суффикс, это идиоматическое (и я бы сказал, даже более читабельное, чем другие ответы здесь):
'abc123'.delete_suffix('123')     # => "abc"
'abc123'.delete_suffix!('123')    # => "abc"
Это даже значительно быстрее (почти 40% с методом взрыва), чем топовый ответ. Вот результат того же теста:
                     user     system      total        real
chomp            0.949823   0.001025   0.950848 (  0.951941)
range            1.874237   0.001472   1.875709 (  1.876820)
delete_suffix    0.721699   0.000945   0.722644 (  0.723410)
delete_suffix!   0.650042   0.000714   0.650756 (  0.651332)
Я надеюсь, что это полезно - обратите внимание, что метод в настоящее время не принимает регулярное выражение, поэтому, если вы не знаете суффикс, он пока не жизнеспособен. Однако, поскольку принятый ответ (обновление: на момент написания) требует того же, я подумал, что это может быть полезно для некоторых людей.
Ответ 2
irb> 'now is the time'[0...-4]
=> "now is the "
Ответ 3
Если символы, которые вы хотите удалить, всегда являются одинаковыми символами, затем рассмотрите 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%.
Ответ 4
str = str[0...-n]
Ответ 5
name = "my text"
x.times do name.chop! end
Здесь в консоли:
>name = "Nabucodonosor"
 => "Nabucodonosor" 
> 7.times do name.chop! end
 => 7 
> name
 => "Nabuco" 
Ответ 6
Я бы предложил chop. Я думаю, что это было упомянуто в одном из комментариев, но без ссылок или объяснений, поэтому вот почему я думаю, что это лучше:
Он просто удаляет последний символ из строки, и вам не нужно указывать какие-либо значения для этого.
Если вам нужно удалить более одного символа, тогда chomp - ваш лучший выбор. Это то, что ruby docs говорит о chop:
Возвращает новую строку с удаленным последним символом. Если строка заканчивается символом \r\n, оба символа удаляются. Применение отбивной до пустого string возвращает пустую строку. Строка # chomp часто безопаснее альтернатива, поскольку она оставляет строку неизменной, если она не заканчивается разделитель записи.
Хотя это используется в основном для удаления разделителей, таких как \r\n, я использовал его для удаления последнего символа из простой строки, например s, чтобы сделать слово сингулярным.
Ответ 7
Удаление последних символов n совпадает с символами length - n.
Активная поддержка включает String#first и String#last методы, которые обеспечивают удобный способ сохранить или отбросить первые/последние символы n:
require 'active_support/core_ext/string/access'
"foobarbaz".first(3)  # => "foo"
"foobarbaz".first(-3) # => "foobar"
"foobarbaz".last(3)   # => "baz"
"foobarbaz".last(-3)  # => "barbaz"
Ответ 8
если вы используете рельсы, попробуйте:
"my_string".last(2) # => "ng"
[EDITED]
Чтобы получить строку БЕЗ последних двух символов:
n = "my_string".size
"my_string"[0..n-3] # => "my_stri"
Примечание: последняя строка char находится в n-1. Итак, чтобы удалить последние 2, мы используем n-3.
Ответ 9
 Проверьте метод slice():
Ответ 10
Вы всегда можете использовать что-то вроде
 "string".sub!(/.{X}$/,'')
Где X - количество символов для удаления.
Или с назначением/использованием результата:
myvar = "string"[0..-X]
где X - количество символов  плюс один для удаления.
Ответ 11
Если вы согласны с созданием методов класса и хотите, чтобы вы отбрасывали символы, попробуйте следующее:
class String
  def chop_multiple(amount)
    amount.times.inject([self, '']){ |(s, r)| [s.chop, r.prepend(s[-1])] }
  end
end
hello, world = "hello world".chop_multiple 5
hello #=> 'hello '
world #=> 'world'
Ответ 12
Использование регулярного выражения:
str = 'string'
n = 2  #to remove last n characters
str[/\A.{#{str.size-n}}/] #=> "stri"
Ответ 13
x = "my_test"
last_char = x.split('').last
