Ruby 打印和打印的区别是什么?

Ruby 打印和打印的区别是什么?,ruby,Ruby,例如,在我写的这行代码中,print和put产生不同的结果 1.upto(1000).each { |i| print i if i % 2 == 0 } put在每个参数的末尾添加新行(如果没有) 打印不添加新行 例如: put[[1,2,3],[4,5,nil]将返回: 1 2 3 4 5 [[1,2,3], [4,5,nil]] 请注意,puts不会输出nil值,而print会输出nil值。print将每个参数(后跟$,)输出到$stdout,后跟$\)。它相当于args.join($

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

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

put
在每个参数的末尾添加新行(如果没有)

打印
不添加新行


例如:

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

1 2 3 4 5 [[1,2,3], [4,5,nil]]
请注意,puts不会输出nil值,而print会输出nil值。
print
将每个参数(后跟
$,
)输出到
$stdout
,后跟
$\
)。它相当于
args.join($,)+$\

放置
$、
$\
设置为“\n”,然后执行与
打印
相同的操作。关键的区别在于,每个参数都是一个带有
put
的新行


您可以
要求使用“english”
访问这些全局变量。

一个很大的区别是,如果您正在显示数组。 尤其是那些零的。 例如:

print [nil, 1, 2]
给予

但是

给予


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

如果您想使用
put
输出字符串中的数组,您将得到与使用
打印时相同的结果:

puts "#{[0, 1, nil]}":
[0, 1, nil]
但如果不使用带引号的字符串,则为“是”。唯一的区别是当我们使用
put

时新行之间的区别给出一些好的提示:

print()→ 无
打印(obj,…)→ 无
将给定对象写入ios。返回
nil

必须打开流进行写入。每个给定的对象都不是一个 字符串将通过调用其
to_s
方法进行转换。什么时候 在没有参数的情况下调用,打印
$的内容

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

put(obj,…)→ 无
将给定对象写入ios。在任何后面写一个换行符 不要已经以换行序列结束。返回
nil

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

对上面给出的要点进行一点实验,差异似乎是:

  • 使用多个参数调用,
    print
    通过“输出字段分隔符”
    $,
    (默认为无)分隔它们,而
    put
    通过换行分隔它们
    put
    还会在最后一个参数后面加一个换行符,而
    print
    不会

    2.1.3:001>打印“你好”,“世界”
    helloworld=>nil
    2.1.3:002>放置“你好”、“世界”
    你好
    世界
    =>零
    2.1.3:003>$,='fanodd'
    =>“范奇”
    2.1.3:004>打印“你好”、“世界”
    HellofOddWorld=>零
    2.1.3:005>放置“你好”、“世界”
    你好
    世界
    =>无
  • put
    自动解压缩数组,而
    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
    将输出记录分隔符
    $\
    写入其打印的内容之后,而
    put
    忽略此变量:

    mark@lunchbox:~$irb
    2.1.3:001>$\='moooooo!'
    =>“呜呜!”
    2.1.3:002>放入“Oink!Baa!Cluck!”
    哎呀!咩!咯咯!
    =>零
    2.1.3:003>打印“Oink!Baa!Cluck!”
    哎呀!咩!咯咯!呜呜!=>无

调用每个参数的
,如果字符串未以新行结尾,则向每个字符串添加新行。
print
只需将每个参数的
调用到
即可输出

例如:
将“一个两个”放在一起
一两个

{新行}

放入“一对二”
一两个

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

打印“一二”
一两个

打印“一二”
一两个

{新行}

还有另一种输出方式:
p

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

这有助于输出调试消息。
p“aa\n\t”
aa\n\t

请参见每个参数后面的换行符。这是一个关键点,从Ruby文档中看不清楚(因为示例只有一个参数)。。。扩展array类并重写to_s方法。puts不会对新类的对象使用新的to_,而print使用irb 0.9.5 puts(“a”)和puts(“a\n”)在REPL上的输出完全相同。@kapv89不是这样的:我刚刚尝试过,两个puts e print都使用to_的方法。只有p不使用它。@Fronker,这仍然只是一个参数。编译器连接相邻的字符串。我今天注意到了这一点,这使我来到这里。我很想知道这方面的想法。这似乎是puts处理这样的数组的一个特例。不知道理由是什么。。。这仅仅是为了与其他语言类似吗?这很有意义,因为puts将以新行输出,因此您可以将其视为在数组上迭代并在每行上调用puts。。。然而,奇怪的是,由于两个原因,它没有输出
nil
-1。首先,缺乏明确性:我不明白开头的“但是……”是什么意思,也不明白最后一段中的“是”是什么意思。其次,由于缺乏正确性:您说在示例代码中使用
printf
而不是
put
,将得到相同的结果,但实际上它是
1
2
puts "#{[0, 1, nil]}":
[0, 1, nil]
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