为什么" put' foo'"并且放置" foo \ n"导致Ruby中的输出相同?

时间:2017-06-23 16:56:19

标签: ruby irb

这是来自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"所期望的。

为什么会这样?

2 个答案:

答案 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时都需要附加换行符。

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

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