🅿️

【Ruby】今さら聞けない puts, p, pp

2024/06/26に公開

概要

Ruby のデバッグでよく使われる puts, p, pp の違いについて解説します。
今までなんとなく使っていた方は、この記事で理解しましょう。

結論

  • puts...オブジェクトを文字列に変換し、改行を追加。
  • p...オブジェクトを出力。
  • pp...複雑なオブジェクト構造を見やすく整形するライブラリ。

検証

こちらのサンプルコードの実行結果を見てみます。

require 'pp'

# データの定義
string = "Hello, World!"
array = [1, 2, 3]
complex_array = [
  {name: "Alice", age: 30, contact: {email: "alice@example.com", phone: "123-4567"}},
  {name: "Bob", age: 25, contact: {email: "bob@example.com", phone: "987-6543"}}
]

# putsで出力
puts "putsでの出力:"
puts string
puts array
puts complex_array

# pで出力
puts "\npでの出力:"
p string
p array
p complex_array

# ppで出力
puts "\nppでの出力:"
pp string
pp array
pp complex_array

puts

Hello, World!
1
2
3
{:name=>"Alice", :age=>30, :contact=>{:email=>"alice@example.com", :phone=>"123-4567"}}
{:name=>"Bob", :age=>25, :contact=>{:email=>"bob@example.com", :phone=>"987-6543"}}

p

"Hello, World!"
[1, 2, 3]
[{:name=>"Alice", :age=>30, :contact=>{:email=>"alice@example.com", :phone=>"123-4567"}},
 {:name=>"Bob", :age=>25, :contact=>{:email=>"bob@example.com", :phone=>"987-6543"}}]

pp

"Hello, World!"
[1, 2, 3]
[{:name=>"Alice",
  :age=>30,
  :contact=>{:email=>"alice@example.com", :phone=>"123-4567"}},
 {:name=>"Bob",
  :age=>25,
  :contact=>{:email=>"bob@example.com", :phone=>"987-6543"}}]

まとめ

メソッド オブジェクトの出力の仕方 整形するか 用途
puts 文字列として出力し、改行を追加 なし 一般的な文字列の出力
p 詳細な情報を出力 なし デバッグ時の詳細情報出力
pp 見やすく整形して出力 あり 複雑なデータ構造の視覚化

puts は文字列への変換と改行を行うので、値を確認するなどのデバッグには向かないですね。
標準で入っていますし、デバッグでは pp を使うのが無難な気がします。

また、 p は内部で inspect メソッドを使用しており、 pp はそれを見やすく整形するライブラリです。
https://docs.ruby-lang.org/ja/latest/method/Object/i/inspect.html
https://docs.ruby-lang.org/ja/latest/library/pp.html

Discussion