print和puts有什么区别?

例如,在我写的这行代码中, printputs产生不同的结果。

 1.upto(1000).each { |i| print i if i % 2 == 0 } 

如果没有一个参数,那么puts将在每个参数的末尾添加一个新行。

print不会添加新行。


例如:

puts [[1,2,3], [4,5,nil]]会返回:

 1
 2
 3
 4
五

print [[1,2,3], [4,5,nil]]会返回:

  [[1,2,3],[4,5,nil]] 

请注意puts如何不输出nil值,而print是这样做的。

一个很大的区别是如果你正在显示数组。 尤其是那些与无。 例如:

 print [nil, 1, 2] 

 [nil, 1, 2] 

 puts [nil, 1, 2] 

 1 2 

请注意,不出现零项(只是一个空白行),并在不同的行上的每个项目。

print输出每个参数,其次是$, ,到$stdout ,接下来是$\ 。 它相当于args.join($,) + $\

puts $,$\为“\ n”,然后做与print一样的东西。 关键的区别在于每个参数都是一个新的行。

您可以require 'english'使用用户友好名称访问这些全局variables。

API文档给出了一些很好的提示:

print() → nil

print(obj, ...) → nil

将给定的对象写入ios 。 该stream必须打开才能写入。 如果输出字段分隔符( $, )不为零,则会将其插入到每个对象之间。 如果输出logging分隔符( $\ )不为零,则会将其附加到输出。 如果没有参数,打印$_ 。 不是string的对象将通过调用它们的to_s方法进行转换。 没有参数的话,打印variables$_的内容。 返回nil。

puts(obj, ...) → nil

将给定的对象写入ios,就像IO#print 。 在没有以换行符结束的任何之后写入一个logging分隔符(通常是一个换行符)。 如果使用数组参数调用,则将每个元素写入新行。 如果调用没有参数,则输出单个logging分隔符。

用上面给出的几点做一点试验,差异似乎是:

  • 调用多个参数, print通过“输出字段分隔符” $, (默认为无)分隔它们,而puts则用换行符分隔它们。 在最后的争论之后, puts也放了一个换行符,而print却没有。

     2.1.3 :001 > print 'hello', 'world' helloworld => nil 2.1.3 :002 > puts 'hello', 'world' hello world => nil 2.1.3 :003 > $, = 'fanodd' => "fanodd" 2.1.3 :004 > print 'hello', 'world' hellofanoddworld => nil 2.1.3 :005 > puts 'hello', 'world' hello world => nil 
  • puts自动解包数组,而print不:

      2.1.3:001> print [1,[2,3]],[4]
     [1,[2,3]] [4] =>无 
     2.1.3:002> puts [1,[2,3]],[4]
     1
     2
     3
     4
      =>零 
  • print没有参数打印$_ (get读取的最后一件事),而puts打印换行符:

     2.1.3 :001 > gets hello world => "hello world\n" 2.1.3 :002 > puts => nil 2.1.3 :003 > print hello world => nil 
  • print输出logging分隔符$\ ,而忽略这个variables:

     mark@lunchbox:~$ irb 2.1.3 :001 > $\ = 'MOOOOOOO!' => "MOOOOOOO!" 2.1.3 :002 > puts "Oink! Baa! Cluck! " Oink! Baa! Cluck! => nil 2.1.3 :003 > print "Oink! Baa! Cluck! " Oink! Baa! Cluck! MOOOOOOO! => nil 

puts调用每个参数的to_s ,并添加一个新的行到每个string,如果它不以新行结束。 print通过调用它们的to_s输出每个参数。

例如: puts "one two"one two

{新队}

puts "one two\n"one two

{new line} #puts不会将新行添加到结果中,因为string以新行结束

print "one two"one two

print "one two\n"one two

{新队}

还有另一种输出方式:

对于每个对象,直接写obj.inspect,后面跟着换行符到程序的标准输出。

输出debugging信息很有帮助。 p "aa\n\t"aa\n\t

print命令只需要你给的任何东西,并将其打印到屏幕上。 puts (对于“put string”)略有不同:它在你想要打印的东西后面添加一个新的(空白)行。

但…

如果你想使用“puts”在string中输出数组,你将得到和使用“print”一样的结果:

 puts "#{[0, 1, nil]}": [0, 1, nil] 

但是,如果不是用引用的string,那么是的。 唯一的区别是我们使用“puts”的新行。

如果使用“打印”,则不会自动创build新行。 使用'puts'它会自动创build一个新行。