1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Ruby の puts と print の違いは改行の有無,だけじゃない

Ruby の初心者向けの記事の定番テーマの一つが「putsprintp の違い」です。
しかし,

  • puts は改行付きで出力
  • print は改行無しで出力
  • p はオブジェクトをそのまま表示
  • p" " 付きで表示

のような記述(にとどまっているもの)が多く,残念です。
" " 付き」は恐らく String オブジェクトの話でしょうね。
「オブジェクトをそのまま」とはどういう意味でしょう???

公式リファレンスを見れば違いがはっきり分かるのにリンクが無い記事が多いのも残念です。(pp のリンクも挙げておきます)

ここでは押さえてほしいポイントを少しだけ挙げておきます。
出力するためにはオブジェクトを文字列化しなければなりませんが,どのように文字列化するかが大事です。

まず,p について。

  • 主にデバッグ用
  • なるべくクラスの違いが出やすいように文字列化
  • リテラルをもつクラスはリテラルの形だったりする
  • 文字列化は inspect メソッドで行う

次に,print について。

  • 文字列化は to_s メソッドで行う

最後に puts について。

  • 引数ごとに改行
  • 配列の場合,要素ごとに改行(要素についても同じ処理)
  • 文字列化は to_s で行う
  • 文字列が末尾に改行を含んでいたら改めて改行しない

puts はちょっと複雑です。
to_ary に反応するオブジェクトは,最初にこれで配列化する」という処理も入るのですが,to_aryto_a と混同しないこと)をもつクラスは稀なので最初は知らなくてもいいかと思います。

ともかく,これらのメソッドを理解するためには inspectto_s について知ることが重要です。

上のリンクは Object クラスの各メソッドへのリンクですが,inspectto_s は多くのクラスでオーバーライドされており,その場合,実際に使われるのはオーバーライドしたほうのメソッドです。
ですから,例えば配列が p メソッドでどのように表示されるかを知るには,Array#inspect を見なければなりません。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?