0
0

4メソッド(puts・print・p・pp)の出力結果の微妙な違い

Posted at

はじめに

今回、Rubyでプログラム問題を解いていた際、

$ ruby random.rb
["A", "B"]
["C", "D", "E", "F"]

の2行の配列の形で出力したいところを、

$ ruby random.rb
A
B
C
D
E
F

でしか出力できず、その理由が
puts, print, p, ppで微妙に挙動が異なることを学んだので、
アウトプットとしてまとめてみたいと思います。

puts

  • オブジェクト出力後の末尾に、改行を加えて出力する
  • putsメソッド自身の戻り値は、nil
puts 12345
puts 'abcde'
12345
abcde
=> nil

# 改行文字\nで改行される
puts "abc\nde"
abc
de
=> nil

print

  • putsとは反対に、改行を加えないで出力する
  • putsメソッドと同じく、printメソッド自身の戻り値もnil
print 12345
print 'abcde'
12345abcde=> nil

# 改行文字\nで改行される
print "abc\nde"
abc
de=> nil

p

  • putsメソッドと同じく改行を加えて出力する。
  • ただし、文字列を出力すると、その文字列がダブルクオート""で囲まれて返ってくる
  • またpメソッドは、引数で渡したオブジェクトそのものが、メソッドの戻り値になる
p 12345
p 'abcde'
12345
"abcde"
=> "abcde"

# 改行文字\nは改行文字のまま出力される
p "abc\nde"
"abc\nde"
=> "abc\nde"

pp

  • pメソッドでは扱いきれない、大きくて複雑な配列やハッシュ、オブジェクトの内容を見やすく整形して出力してくれる
  • pメソッド同様、引数で渡したオブジェクトそのものが、メソッドの戻り値

配列を渡した場合の挙動の違い

今回の記事を書くきっかけとなったポイントですが、
配列を渡した場合、それぞれの違いが顕著に見られる

a = ["A", "B", "C"]

# putsの場合(要素ごとに改行)
puts a
A
B                                                
C                                                
=> nil

# printの場合
print a
["A", "B", "C"]=> nil

# pの場合
p a
["A", "B", "C"]
=> ["A", "B", "C"](オブジェクトそのものが戻り値)  

使い分け

  • putsとprint: 一般ユーザ向け
  • pとpp: 開発者向け
  • putsとprintは改行の有無で使い分ける

また、
putsとprintは引数で渡されたオブジェクトに対して.to_sメソッドを呼び出し文字列に変換している一方、
pメソッドは.to_sメソッドではなくinspectメソッドを呼び出す
(pメソッドでは文字列が”"で囲まれて出力されていたのは、
内部的にStringクラスのinspectメソッドが呼び出されていたから。)

この点に関しては下記の記事に詳しく解説されています
.to_sメソッドとinspectメソッドの違い

まとめ

今回の内容を一覧にすると、下記のようにまとめられます。

メソッド 出力後の改行 配列の表示 文字列変換 戻り値 対象者
puts あり  要素ごとに改行 to._s nil 一般ユーザ
print なし 改行しない to._s nil 一般ユーザ
p あり 改行しない inspect 引数のオブジェクト 開発者
pp あり 見やすく整形 inspectに似た方法 引数のオブジェクト 開発者

参考文献

プロを目指す人のためのRuby入門[改訂2版]

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0