回答:
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は出力することに注意してください。
大きな違いは、配列を表示するかどうかです。特にNILを持つもの。例えば:
print [nil, 1, 2]
与える
[nil, 1, 2]
だが
puts [nil, 1, 2]
与える
1
2
表示されるnilアイテム(空白行のみ)はなく、各アイテムは異なる行にあることに注意してください。
nil
print
各引数を出力し、その後に$,
、to $stdout
、を続け$\
ます。に相当args.join($,) + $\
puts
セットの両方$,
と$\
の「\ n」は、その後、同じことを行いますprint
。主な違いは、各引数がで改行されることputs
です。
english
libのヒント
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
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
を使用して文字列内の配列を出力する場合は、次のように使用puts
した場合と同じ結果が得られますprint
。
puts "#{[0, 1, nil]}":
[0, 1, nil]
しかし、引用符で囲まれた文字列を削除しない場合は、はい。使用するときの唯一の違いは、新しい行の違いですputs
。
printf
代わりにを使用puts
すると同じ結果が得られると言いますが、実際にはそうではありません。puts
バリアントは最後に改行を追加しながら、printf
1はしない、単なる文字列に補間なしの配列がない場合などです。(文字列リテラルを評価するときに補間が行われるため、必ずしもそうです。)