Ruby の初心者向けの記事の定番テーマの一つが「puts
,print
,p
の違い」です。
しかし,
-
puts
は改行付きで出力 -
print
は改行無しで出力 -
p
はオブジェクトをそのまま表示 -
p
は" "
付きで表示
のような記述(にとどまっているもの)が多く,残念です。
「" "
付き」は恐らく String オブジェクトの話でしょうね。
「オブジェクトをそのまま」とはどういう意味でしょう???
公式リファレンスを見れば違いがはっきり分かるのにリンクが無い記事が多いのも残念です。(pp
のリンクも挙げておきます)
- Kernel.#puts (Ruby 2.7.0 リファレンスマニュアル)
- Kernel.#print (Ruby 2.7.0 リファレンスマニュアル)
- Kernel.#p (Ruby 2.7.0 リファレンスマニュアル)
- Kernel.#pp (Ruby 2.7.0 リファレンスマニュアル)
ここでは押さえてほしいポイントを少しだけ挙げておきます。
出力するためにはオブジェクトを文字列化しなければなりませんが,どのように文字列化するかが大事です。
まず,p
について。
- 主にデバッグ用
- なるべくクラスの違いが出やすいように文字列化
- リテラルをもつクラスはリテラルの形だったりする
- 文字列化は
inspect
メソッドで行う
次に,print
について。
- 文字列化は
to_s
メソッドで行う
最後に puts
について。
- 引数ごとに改行
- 配列の場合,要素ごとに改行(要素についても同じ処理)
- 文字列化は
to_s
で行う - 文字列が末尾に改行を含んでいたら改めて改行しない
puts
はちょっと複雑です。
「to_ary
に反応するオブジェクトは,最初にこれで配列化する」という処理も入るのですが,to_ary
(to_a
と混同しないこと)をもつクラスは稀なので最初は知らなくてもいいかと思います。
ともかく,これらのメソッドを理解するためには inspect
や to_s
について知ることが重要です。
- Object#inspect (Ruby 2.7.0 リファレンスマニュアル)
- Object#to_s (Ruby 2.7.0 リファレンスマニュアル)
- Object#to_ary (Ruby 2.7.0 リファレンスマニュアル)
上のリンクは Object
クラスの各メソッドへのリンクですが,inspect
や to_s
は多くのクラスでオーバーライドされており,その場合,実際に使われるのはオーバーライドしたほうのメソッドです。
ですから,例えば配列が p
メソッドでどのように表示されるかを知るには,Array#inspect を見なければなりません。