📖

puts, print, pの挙動の違いについて

2023/02/12に公開

puts, print, pの挙動の違いについて

はじめに

初めまして、チーターと申します。
記念すべき初投稿は、「p」「puts」「print」の挙動の違いについてです。
書籍で学習中、「p」「puts」はなんで使い分けるんだ?と疑問に思ったので、違いについて調べたことを記載します。

出力系メソッド

「p」「puts」「print」これらのメソッドは出力系メソッドと呼ばれ、ログやコンソールに何らかの処理の結果を目に見える形で出力するためのもの。
他にも、「printf」「sprintf」などがある。

pメソッド

pメソッドは、引数に文字列や整数、配列などを指定すると、人が見やすい形に整形(引数に何もなければ出力されない、引数がある場合は.inspectが実行される)して改行と順番に出力する。また、Pメソッドは引数に渡されたオブジェクトそのものがメソッドの戻り値になる。("")(\n)なども出力されるので、デバッグの際に使われる。

putsメソッド

putsメソッドは、引数と改行を順番に出力する。(引数がなければ改行のみ、引数が配列の場合は、要素と改行を順番に出力、配列又は文字列以外のオブジェクトとが引数として与えられた場合は、最初に.to_aryが実行されて、その次に.to_sが実行される)putsメソッドは、ただ出力されるだけなので、返り値はnilになる。

printメソッド

printメソッドは、引数を順番に出力する。(引数が文字列以外の場合、.to_sが実行される)改行はされない。(必要な場合は\nの改行文字を入れる)printメソッドもただ表示するだけなので、返り値はnilになる。

比較してみた

文字列の場合

#pメソッド(オブジェクトをそのまま)
> p "Hello"
"Hello"
=> "Hello"

#putsメソッド(改行がある)
> puts "Hello"
Hello
=> nil

#printメソッド(改行がない)
print "Hello"
Hello=> nil

数値の場合

#pメソッド
> p 123
123
=> 123

#putsメソッド
> puts 123
123
=> nil

#printメソッド
> print 123
123=> nil

配列の場合

#pメソッド
> p ["a", "b", "c"]
["a", "b", "c"]
=> ["a", "b", "c"]

#putsメソッド
> puts ["a", "b", "c"]
a
b
c
=> nil

#printメソッド
> print ["a", "b", "c"]
["a", "b", "c"]=> nil

改行文字を含めた文字列

#pメソッド
> p "abc\ndefg"
"abc\ndefg"
=> "abc\ndef"

#putsメソッド
> puts "abc\ndefg"
abc
defg
=> nil

#printメソッド
> print "abc\ndefg"
abc
defg=> nil

まとめ

それぞれを実行したときに呼び出されるメソッド(.inspect, to_s)があったんですね。比較したことで、それぞれの挙動について理解が深まりました。

使い方としては、
pメソッドは、オブジェクトの情報を得たい時、詳しい情報を得たい時。デバッグ用。
putsメソッドは、改行したいとき。
printメソッドは、改行したくないとき。
でしょうか。
誤り等ありましたら、ご指摘いただければと思います。

Discussion