Rubyでのデータ検査入門:puts・inspect・pメソッドの使い方
例外の多くは、本来なら問題なく動作するメソッドに予期しないデータが渡されることで発生します。そのため、エラーの原因を突き止めるには、アプリケーション内で対象のデータがどのように流れているかを追跡するのが有効です。この記事では、RubyおよびRailsアプリケーションにおけるデータの検査(インスペクション)方法を紹介します。
puts、#inspect、p
Rubyのputsメソッドは、コンソールにメッセージを出力するために使われます。
unknown = "This is a string"
puts unknown
上記のスクリプトを実行すると、変数の中身が出力され、値を確認できます。
$ ruby puts.rb
This is a string
しかし、unknown変数に空文字列やnil、空のハッシュが格納されている場合、putsは空行を出力するだけです。これでは正確な値を確認できず、たとえば空のハッシュと空文字列を区別することもできません。
$ ruby puts_empty_string.rb
幸い、inspectというインスタンスメソッドがあり、あらゆるオブジェクトに実装されています。このメソッドはオブジェクトの文字列表現を返します。
unknown = ""
puts unknown.inspect
空文字列に対しては引用符のペアが、配列に対しては角括弧のペアが返されます。
$ ruby inspect_empty_string.rb
""
$ ruby inspect_empty_array.rb
[]
putsとinspectの組み合わせは非常によく使われるため、両方を一度に行えるショートカットとしてpが用意されています。動作はまったく同じですが、タイプ量が少なくて済みます。
unknown = ""
p unknown # `puts unknown.inspect` と同等
Railsビューでのデータ検査
pというショートカットがあるものの、コンソールへ出力せずにオブジェクトの文字列表現だけが必要な場面では、inspectメソッドそのものを知っておくと役立ちます。
たとえばRailsのビューでは、ログの中から該当箇所を探すよりも、生成されるHTMLページに直接値を出力したほうが手っ取り早いことがあります。
<%= params.inspect %>
ただし、複雑なデータ構造を検査する場合、結果が1行で出力されるため、目的のデータを見つけにくいことがあります。
Railsには、この問題を解決するdebugヘルパーが用意されています。単に値を検査するだけでなく、オブジェクトを人間が読みやすいYAML形式に変換し、整形を保つために<pre>タグで囲んで出力します。
<%= debug params %>
debugヘルパーは、内部でto_yamlメソッドを使ってYAML表現を取得し、それを<pre>ブロックで囲んでいます。<pre>タグで囲まずにオブジェクトをYAML形式へ変換したい場合は、任意のオブジェクトに対して直接#to_yamlを呼び出せます。
irb(main):004:0* puts Product.first.to_yaml
--- !ruby/object:Product
concise_attributes:
- !ruby/object:ActiveRecord::Attribute::FromDatabase
name: id
value_before_type_cast: 4
- !ruby/object:ActiveRecord::Attribute::FromDatabase
name: title
value_before_type_cast: Title
....
お察しのとおり、YAML形式の出力にもショートカットが用意されています。上記の例は、y Product.firstと書くだけで1行で実行できます。
irb(main):004:0* y Product.first # `puts Product.first.to_yaml` と同等
--- !ruby/object:Product
...
「puts」デバッグのすすめ
アプリケーションのデータを検査する方法はほかにもあります。たとえばPryライブラリやRuby標準のデバッガなどが挙げられます。こうしたツールも試してみる価値は十分にありますが、実際には、コンソールへログを出力したり、ビューにデータを表示したりするのが、何が起きているのかを最も手軽かつ迅速に把握できる方法であることが多いでしょう。
この記事が役に立ったかどうか、ご質問、そして次に読みたいテーマなどがあれば、ぜひ@AppSignalまでお知らせください。
-
【Ruby入門】開発者が押さえておきたい主要データ構造の特徴と使い方
データ構造とは? データ構造とは、データを整理し、効率よくアクセスするための具体的な方法のことです。 代表的な例としては以下のようなものがあります。 配列(Array) 二分木(Binary Tree) ハッシュ(Hash) データ構造ごとに得意な処理は異なります。たとえば、ハッシュは辞書(単語と意味)や電話帳(名前と電話番号)のように「キーと値」のペアを扱うデータの保存に最適です。 どのようなデータ構造が存在するのか、そしてそれぞれの特性を理解することは、Ruby開発者としてのレベルアップに直結します。 本記事では、その知識をわかりやすく解説していきます! 配列(Array)を理解する
-
Ruby 2.6の新機能9選|コード例でわかる注目ポイントを徹底解説
Ruby 2.6には、開発者の生産性を高める新しい機能やパフォーマンス改善が多数盛り込まれています。 本記事では、Ruby 2.6で導入された9つの注目新機能を、実際のコード例とともにわかりやすく紹介します。最新のRuby動向をキャッチアップしたい方は、ぜひ最後までご覧ください。 1. 無限Range(Endless Range) Ruby 2.5以前でもFloat::INFINITYを使えば終端のない範囲を表現できましたが、Ruby 2.6ではさらに直感的な記法が使えるようになりました。 新しい無限Rangeは次のように書きます。 (1..) 通常のRangeが(1..10)のように終端