将输出格式化为每行40个字符
我对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], " " }
x.each { |n| print n[0..40], " " }
但它似乎没有做任何事情。
任何帮助将是太棒了!
该方法word_wrap
需要一个Strind和让人有种漂亮的印刷。
你的数组被转换为一个带有join("n")
的字符串join("n")
代码:
def word_wrap(text, line_width = 40 )
return text if line_width <= 0
text.gsub(/n/, ' ').gsub(/(.{1,#{line_width}})(s+|$)/, "1n").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(" "))
现在魔术发生了
gsub(/(.{1,#{line_width}})(s+|$)/, "1n")
(.{1,#{line_width}})
):将任何字符line_width
为line_width
字符。 (s+|$)
:下一个字符必须是空格或行结尾(换句话说:如果最后一个字符没有空格,则前一个匹配可能会缩短line_width
。 "1n"
:取最多40个字符长的字符串并用换行符结束。 gsub
重复包装直到完成。 最后,我用strip
删除了前导和尾随空格
我还加了一个长词(50个)。 怎么了? gsub不匹配,这个词保持原样。
puts x.join(" ").scan(/(.{1,40})(?:s|$)/m)
这是一个简单的句子。 这很简单
句子出现在三行上。
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]
始终是整个字符串。