Метод word_wrap
ожидает Strind и создает довольно симпатичный отпечаток.
Ваш массив преобразуется в строку с join("\n")
Код:
def word_wrap(text, line_width = 40 )
return text if line_width <= 0
text.gsub(/\n/, ' ').gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip
end
x = ["This is a simple sentence.", "This simple", "sentence appears", "on three lines."]
puts word_wrap(x.join("\n"))
x << 'a' * 50 #To show what happens with long words
x << 'end'
puts word_wrap(x.join("\n"))
Объяснение кода:
x.join("\n"))
построить строку, затем построить одну длинную строку с помощью text.gsub(/\n/, ' ')
.
В этом особом случае эти два шага могут быть объединены: x.join(" "))
А теперь волшебство 1018 * происходит с
gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n")
(.{1,#{line_width}})
): взять любой символ длиной до line_width
символов.
(\s+|$)
: следующий символ должен быть пробелом или концом строки (другими словами: предыдущее совпадение может быть короче line_width
, если последний символ не имеет пробела.
"\\1\n"
: Возьмите строку длиной до 40 символов и завершите ее новой строкой.
gsub
повторять обертывание до его завершения.
И в конце я удаляю начальные и конечные пробелы с помощью strip
Я также добавил длинное слово (50 а). Что просходит? Gsub не совпадает, слово остается как есть.