Небольшое прикосновение регулярного выражения сработает:
s = "The quick brown fox jumps over the lazy dog"
def limit_length(s, limit)
s =~ /\A.{0,#{limit}}(?=\Z| )/ && $& || ''
end
p limit_length(s, 2) # => ""
p limit_length(s, 3) # => "The"
p limit_length(s, 42) # => "The quick brown fox jumps over the lazy"
p limit_length(s, 43) # => "The quick brown fox jumps over the lazy dog"
Регулярное выражение с разбивкой:
\A From the beginning of the string
.{0,#{limit}} Match up to *limit* characters
(?=\Z| ) Followed by the end of the string or a blank
Бит Perl-esque в конце возвращает совпадающую строку или, если нет совпадения, пустую строку. Он ломается так:
&& If true (i.e., if match)
$& matched string
|| else
'' empty string