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 を見なければなりません。