print和puts有什么区别?

时间:2011-02-16 15:53:15

标签: ruby

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

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

6 个答案:

答案 0 :(得分:360)

如果没有一个参数,

puts会在每个参数的末尾添加一个新行。

print不会添加新行。


例如:

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

1
2
3
4
5

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

[[1,2,3], [4,5,nil]]
注意puts如何输出nil值而print不会。

答案 1 :(得分:61)

一个很大的区别是,如果您正在显示数组。 特别是那些有NIL的人。 例如:

print [nil, 1, 2]

给出

[nil, 1, 2]

puts [nil, 1, 2]

给出

1
2

注意,没有出现nil项(只是一个空白行)和不同行上的每个项目。

答案 2 :(得分:40)

print将每个参数(后跟$,)输出到$stdout,然后输出$\。它相当于args.join($,) + $\

puts$,$\设置为“\ n”,然后执行与print相同的操作。关键区别在于每个参数是一个带puts的新行。

您可以require 'english'使用user-friendly names访问这些全局变量。

答案 3 :(得分:18)

The API docs给出了一些好的提示:

  

print() → nil

     

print(obj, ...) → nil

     

将给定对象写入 ios 。返回nil

     

必须打开流才能写入。每个给定的对象不是   字符串将通过调用其to_s方法进行转换。什么时候   不带参数调用,打印$_

的内容      

如果输出字段分隔符($,)不是nil,则为   插入对象之间。如果输出记录分隔符   ($\)不是nil,它会附加到输出中。

     

...

     

puts(obj, ...) → nil

     

将给定对象写入 ios 。在任何后面写一个换行符   还没有以换行符结束。返回nil

     

必须打开流才能写入。如果使用数组参数调用,   将每个元素写在新行上。每个给定的对象不是   字符串或数组将通过调用其to_s方法进行转换。   如果不带参数调用,则输出一个换行符。

稍微尝试上面给出的几点,差异似乎是:

  • 使用多个参数调用时,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] => nil 
    2.1.3 :002 > puts [1, [2, 3]], [4]
    1
    2
    3
    4
     => nil
  • 没有参数的
  • print打印$_gets读取的最后一件事),而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在输出的任何内容后写入输出记录分隔符$\,而puts忽略此变量:

    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

答案 4 :(得分:3)

puts调用每个参数的to_s,并为每个字符串添加一个新行,如果它不以新行结尾。 print只需通过调用to_s来输出每个参数。

例如: puts "one two"one two

{new line}

puts "one two\n"one two

{new line} #puts不会在结果中添加新行,因为字符串以新行结尾

print "one two"one two

print "one two\n"one two

{new line}

还有另一种输出方式:p

  

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

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

答案 5 :(得分:-1)

但是...

如果您想使用" puts"在字符串中输出数组,您将获得与使用" print":

时相同的结果
puts "#{[0, 1, nil]}":
[0, 1, nil]

但如果没有带引号的字符串则是。唯一的区别是当我们使用" puts"