这是来自irb:
irb(main):001:0> puts "abc"
abc
=> nil
irb(main):002:0> puts "abc\n"
abc
=> nil
irb(main):003:0> puts "abc\n\n"
abc
=> nil
正如您所看到的,puts "abc"
会在" abc"之后添加换行符。但是,puts "abc\n"
也会放一个换行符,而我预计会有两个换行符
对我来说,puts "abc\n\n"
的输出是我对puts "abc\n"
所期望的。
为什么会这样?
答案 0 :(得分:6)
在阅读了Cary Swoveland的comment后,我意识到puts
的工作原理并不明显,因为its documentation非常缺乏:
puts(obj,...)→nil
相当于
$stdout.puts(obj, ...)
它甚至没有解释$stdout
是什么,也没有提供链接。
$stdout
是Ruby预定义的global variables之一。它指的是standard output,它在Ruby中恰好是IO
的实例:
$stdout
#=> #<IO:<STDOUT>>
所以“等同于$stdout.puts(obj, ...)
”意味着我们必须阅读IO#puts
的文档:
将给定对象写入ios。在任何尚未以换行符结束的内容之后写入换行符。返回
nil
。
你去了:puts
只有在对象尚未结束时才添加新行。
要获得预期的多行输出,您只需为每一行调用puts
:
puts 'abc'
或
puts 'abc'
puts
或
puts 'abc'
puts
puts
答案 1 :(得分:1)
这就是puts
的工作原理。它可以防止您每次拨打puts
时都需要附加换行符。
如果没有换行,将添加一个 给定一个尾随换行符,不会添加额外的换行符