6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【初心者必読】Ruby の誤解あるあるAdvent Calendar 2020

Day 21

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

Last updated at Posted at 2020-12-21

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

6
1
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
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?