プリントとプットの違いは何ですか?


回答:


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
もう1つあります...配列クラスを拡張し、to_sメソッドをオーバーライドします。putsは新しいクラスのオブジェクトに新しいto_sを使用しませんが、printは使用します
kapv89

1
irb 0.9.5 puts( "a")とputs( "a \ n")を使用すると、REPLでまったく同じ出力が得られます。
Marcus Junius Brutus

@ kapv89それは真実ではありません。私は試してみましたが、両方のeプリントでto_sメソッドを使用しています。pだけは使用しません。
collimarco 14年

6
@Fronker、それはまだ1つの引数にすぎません。コンパイラは隣接する文字列を連結します。
cdunn2001

61

大きな違いは、配列を表示するかどうかです。特にNILを持つもの。例えば:

print [nil, 1, 2]

与える

[nil, 1, 2]

だが

puts [nil, 1, 2]

与える

1
2

表示されるnilアイテム(空白行のみ)はなく、各アイテムは異なる行にあることに注意してください。


1
今日、これに気づきました。その考えを知りたいです。そのような配列を処理するputsの特別なケースのようです。理論的根拠は何だったのだろう...それは他の言語に似ているだけですか?
ダン・バロン

putsは新しい行で出力するので、それは理にかなっているので、配列で繰り返し、各行でputsを呼び出すと考えることができます...しかし、出力されないのは奇妙ですnil
Muers

42

print各引数を出力し、その後に$,、to $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] => 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

putsto_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
理由は2つあります。まず、明確さの欠如:最初の「しかし...」がこれから続くことを意図しているのか、最後の段落の「はい」が何に返信しているのか理解していません。第二に、正確さの欠如のために:あなたはあなたのサンプルコードのprintf代わりにを使用putsすると同じ結果が得られると言いますが、実際にはそうではありません。putsバリアントは最後に改行を追加しながら、printf1はしない、単なる文字列に補間なしの配列がない場合などです。(文字列リテラルを評価するときに補間が行われるため、必ずしもそうです。)
Mark Amery

ああ!他の回答を読んだ後、私は理解していると思います-これはstackoverflow.com/a/14534145/1709587への返信であるつもりでしたか?いずれにせよ、それ自体が実際に答えを出すわけではありません。
マークアメリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.