为什么 "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
.
时都需要添加换行符
如果没有换行,将添加一个
给定尾随换行符,不会添加额外的换行符
读完 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
这是来自 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
.
如果没有换行,将添加一个
给定尾随换行符,不会添加额外的换行符
读完 Cary Swoveland 的 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