回答:
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です。
englishlibのヒント
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
=> nilputsは自動的に配列をアンパックしますが、以下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
=> nilprintこの変数$\を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! => nilputsto_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バリアントは最後に改行を追加しながら、printf1はしない、単なる文字列に補間なしの配列がない場合などです。(文字列リテラルを評価するときに補間が行われるため、必ずしもそうです。)