Формат вывода до 40 символов в строке - PullRequest
0 голосов
/ 26 сентября 2011

Я довольно новичок в Ruby и уже несколько часов ищу Google.Кто-нибудь знает, как форматировать выходные данные для печати длиной не более 40 символов?

Например:

Что я хочу напечатать:

This is a simple sentence.
This simple
sentence appears
on four lines. 

Но я хочу, чтобы он был отформатирован как:

This is a simple sentence. This simple
sentence appears on four lines.

Каждая строка оригинала помещена в массив.
итак x = ["This is a simple sentence.", "This simple", "sentence appears", "on three lines."]
Я пытался x.each { |n| print n[0..40], " " }, но, похоже, ничего не получалось.

Любая помощь будет фантастической!

Ответы [ 3 ]

3 голосов
/ 26 сентября 2011

Метод 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 не совпадает, слово остается как есть.

2 голосов
/ 27 сентября 2011
puts x.join(" ").scan(/(.{1,40})(?:\s|$)/m)

Это простое предложение.Это простое предложение
состоит из трех строк.

1 голос
/ 26 сентября 2011

Ruby 1.9 (и не слишком эффективный):

>> x.join(" ").each_char.each_slice(40).to_a.map(&:join)
=> ["This is a simple sentence. This simple s", "entence appears on three lines."]

Причина, по которой ваше решение не работает, состоит в том, что все отдельные строки короче 40 символов, поэтому n[0..40] всегда представляет собой всю строку.

...