はじめに
今回、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
- 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 | 一般ユーザ |
なし | 改行しない | to._s | nil | 一般ユーザ | |
p | あり | 改行しない | inspect | 引数のオブジェクト | 開発者 |
pp | あり | 見やすく整形 | inspectに似た方法 | 引数のオブジェクト | 開発者 |