为什么 "puts 'foo'" 和 puts "foo\n" 在 Ruby 中产生相同的输出?

Why does "puts 'foo'" and puts "foo\n" result in the same output in Ruby?

这是来自 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".

的期望

为什么会这样?

这就是 puts 的工作原理。它可以防止您每次调用 puts.

时都需要添加换行符

如果没有换行,将添加一个
给定尾随换行符,不会添加额外的换行符

来源:http://ruby-doc.org/core-2.4.1/IO.html#method-i-puts

读完 Cary Swoveland 的 I've realized that it is not at all obvious how puts works, because its documentation 相当稀缺:

puts(obj, ...) → nil

Equivalent to

$stdout.puts(obj, ...)

甚至懒得解释什么是$stdout,也不提供link。

$stdout 是 Ruby 的预定义之一 global variables. It refers to the standard output which in Ruby happens to be an instance of IO:

$stdout
#=> #<IO:<STDOUT>>

所以“等同于$stdout.puts(obj, ...)”意味着我们必须阅读IO#puts的文档:

Writes the given object(s) to ios. Writes a newline after any that do not already end with a newline sequence. Returns nil.

好了:puts 仅在对象尚未以换行符结尾时才添加换行符。

要获得预期的多行输出,您只需为每一行调用 puts

puts 'abc'

puts 'abc'
puts

puts 'abc'
puts
puts