印刷和看跌期权有什么区别?


Answers:


377

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如何。

88
实际上,每个参数后都有一个换行符。这是关键点,从Ruby文档中还不清楚(因为该示例只有1个参数)。
cdunn2001

3
还有另一件事...扩展数组类并覆盖to_s方法。puts不会将new to_s用于新类的对象,而print会使用
kapv89

1
使用irb 0.9.5 puts(“ a”)和puts(“ a \ n”)在REPL上具有完全相同的输出。
Marcus Junius Brutus

@ kapv89事实并非如此:我刚刚尝试过,并且两个都使用to_s方法进行打印。只有p不使用它。
collimarco 2014年

6
@Fronker,那仍然只是一个论点。编译器连接相邻的字符串。
cdunn2001

61

一个很大的不同是,如果要显示数组。尤其是那些有NIL的人。例如:

print [nil, 1, 2]

[nil, 1, 2]

puts [nil, 1, 2]

1
2

请注意,没有出现零项目(只是空白行),并且每个项目都在不同的行中。


1
我今天注意到了这一点,把我带到了这里。我很想知道这个想法。对于这样的puts来说,这似乎是一种特殊情况。不知道其基本原理是什么...是否仅仅是类似于其他语言?
丹·巴伦

这是有道理的,因为puts将以新的一行输出,因此您可以将其视为在数组上迭代并在每一行上调用puts…奇怪的是,它没有输出nil
Muers,2014年

42

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

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

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


englishlib 上的一个不错的提示
lacostenycoder

18

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

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> 打印[1,[2、3]],[4]
    [1,[2,3]] [4] =>无 
    2.1.3:002> 看跌期权[1,[2,3]],[4]
    1个
    2
    3
    4
     =>无
  • 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

puts调用to_s每个参数的,如果不以新行结尾,则向每个字符串添加新行。 print只需通过调用每个参数即可输出它们to_s

例如 puts "one two"one two

{新队}

puts "one two\n"one two

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

print "one two"one two

print "one two\n"one two

{新队}

还有另一种输出方式: p

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

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


-1

如果要在字符串中使用来输出数组puts,则将获得与使用时相同的结果print

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

但是,如果不带引号的字符串,则可以。唯一的区别是使用时换行了puts


1
-1有两个原因。首先,缺乏明确性:我不明白这里最初的“但是...”打算从何而来,也不清楚最后一段中的“是”。其次,由于缺乏正确性:您说在示例代码中使用printf代替puts会得到相同的结果,但实际上并没有。该puts变种在最后添加一个换行符,而printf一个没有,就好像那里没有阵列插入到字符串的情况。(有必要这样,因为插值发生在评估字符串文字时。)
Mark Amery

啊哈!阅读其他答案后,我想我理解-您打算将此作为对stackoverflow.com/a/14534145/1709587的答复?无论如何,它本身并不能真正解决问题。
Mark Amery
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.