#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 ваше решение не предоставляет запрошенный результат.