🍇

「puts、print、p」の違いについて【Ruby入門】

2021/05/31に公開

はじめに

Rubyの勉強を始めると最初に必ず使うメソッド「putsメソッド」
そして後々知ることになる「printメソッド」「pメソッド」

大体できることは同じなのですが、微妙に違いがありました。

puts

putsメソッドはオブジェクト出力後に改行して、変数の内容やメソッドの戻り値を出力します。
あと、putsメソッド自身の戻り値は「nil」

puts 12345
12345
=> nil

puts 'Hello!!'
Hello!!
=> nil

# 改行文字「\n」が使える
puts "abc\ndef"
abc
def
=> nil

print

printメソッドはオブジェクト出力後に改行されない。
putsメソッドと同じく、printメソッド自身の戻り値も「nil」

print 12345
12345=> nil

print 'Hello!!'
Hello!!=> nil

# 改行文字「\n」が使える
print "abc\ndef"
abc
def=> nil

p

pメソッドは、putsメソッドと同じくオブジェクト出力後に改行される。
文字列を出力すると、ダブルクオート("")で囲まれて出力される。

ここが1番の違いですが、pメソッドは渡されたオブジェクトそのものがメソッドの戻り値になる。
そして改行文字(\n)がそのまま出力される。

p 12345
12345
=> 12345

p 'Hello!!'
"Hello!!"
=> "Hello!!"

# 改行文字「\n」が使えない
p "abc\ndef"
"abc\ndef"
=> "abc\ndef"

配列を渡した場合の違い

配列でも上で説明した違いが現れます。

a = [1, 2, 3]

# putsメソッドの場合
puts a
1
2
3
=> nil

# printメソッドの場合
print a
[1, 2, 3]=> nil

# pメソッドの場合
p a
[1, 2, 3]
=> [1, 2, 3]

まとめ

それぞれの違いがこんな感じです。

メソッド 出力後の改行 配列の表示 呼び出すメソッド 戻り値
puts あり 要素ごとに改行 to_s nil
print あり 改行しない to_s nil
p なし 改行しない inspect 引数のオブジェクト

ちなみに、「to_sメソッド」は、オブジェクトの内容を文字列に変換するメソッドのこと。
「inspectメソッド」は、オブジェクトの内容を文字列に変換し、開発者にわかりやすい感じに出力してくれます。(今回だとダブルクオート""で囲まれていた)
両者の違いが知りたい方は、はじめてのRuby!inspectとは!?使い方を徹底解説!をどうぞ。

使い分けとしては以下のような感じでしょうか。
・putsメソッドは、改行したい時に使う
・printメソッドは、改行したくない時に使う
・pメソッドは、デバックなどでより詳しい内容を知りたい時に使う

参考文献

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで

Discussion