Странное поведение Truncate в Rails 3

#ruby #string #ruby-on-rails-3

#ruby #строка #ruby-on-rails-3

Вопрос:

Я пробовал метод String#truncate, предоставляемый Rails 3:

 irb(main):001:0> "abcde".truncate(1)
=> "abc..."
irb(main):002:0> "abcde".truncate(2)
=> "abcd..."
irb(main):003:0> "abcde".truncate(3)
=> "..."
irb(main):004:0> "abcde".truncate(4)
=> "a..."
irb(main):005:0> "abcde".truncate(5)
=> "abcde"
irb(main):006:0> "abcde".truncate(6)
=> "abcde"
  

Я ожидаю чего-то вроде "a..." , "ab..." "abc..."

Я не понимаю, почему это так действует.

Я использую Ruby 1.8.7.

Ответ №1:

Длина, которую вы предоставляете, truncate должна включать ... , поэтому длины 4 или больше должны работать идеально.

Похоже, в String#truncate методе есть ошибка. Глядя на исходный код, не похоже, что там есть что-либо для обработки предоставленных длин меньше 3.

Пример:

Когда вы указываете 4 в качестве длины, rails вычитает 3 для ... , оставляя скорректированную длину как 1 . Итак, тогда rails использует это 1 в качестве конечной части подстроки «abcde»:

 "abcde"[0...1]   '...'
# => "a..."
  

Однако, если вы укажете 1 в качестве длины, после вычитания 3 ваша скорректированная длина станет -2 . Подключение -2 к диапазону дает вам это:

 "abcde"[0...-2]   '...'
# => "abc..."
  

Ответ №2:

Вы можете принудительно передать ожидаемое поведение

 :omission => ''
  

для усечения.

Комментарии:

1. Работает ли это в 1.8.7? В 1.9.3 и Rails 3.2 ваше решение не предоставляет запрошенный результат.