rubyには、オブジェクトや配列をわかりやすい文字列で返すメソッドとして、inspectメソッドが用意されています。
「オブジェクトや配列をわかりやすく出力するには?」
「inspectメソッドの使い方/書き方は?」
「inspectとto_sって何が違うの?」
といった方に向けて、この記事では、
【基礎】inspectメソッドとは何か?
【基礎】inspectメソッドの使い方
【発展】inspectとto_sの違い
など、inspectメソッドについての基礎から発展的な内容について解説していきます。
inspectとは
inspectメソッドとは、オブジェクトや配列などをわかりやすく文字列で返してくれるメソッドです。
実はデバッグでよく利用されるpメソッド(標準出力するメソッド)は、このinspectメソッドが使われています。
そのinspectメソッドの構文は以下のように表せます。
"オブジェクトや配列など".inspect
inspectメソッドの概要と書き方が分かったところで、次の項ではinspectメソッドの使い方について解説いたします。
inspectメソッドの使い方
inspectメソッドは、Objectクラスで定義されており、クラス名・オブジェクトid・インスタンス変数を出力します。
さらに、Stringクラス、Hashクラス、Arrayクラス、などそれぞれのクラスでinspectメソッドはオーバーライド(上書き)されています。
つまり、inspectメソッドは対象の型に沿った文字列を返すのです。
それでは、それぞれの型でinspectメソッドを使用した場合、どのように出力されるか具体的に確認していきましょう。
文字列や数値をinspectで出力する
inspectメソッドは文字列や数値の場合、値をそのまま出力します。
puts "moji".inspect puts 12.inspect
実行結果:
"moji" 12
配列やハッシュをinspectで出力する
配列やハッシュの場合は、全体を[]または{}で囲み、各要素をそれぞれinspectメソッドで出力した結果が返ります。
array = ["apple", 1, true] hash = {:name => "tanaka", :age => 25} puts array.inspect puts hash.inspect
実行結果:
["apple", 1, true] {:name=>"tanaka", :age=>25}
モジュールやクラスをinspectで出力する
対象がモジュールの場合、モジュール名が実行結果として出力されます。
また、対象がクラスの場合、「#<クラス名:オブジェクトid インスタンス変数>」が実行結果として出力されます。
以下に、モジュールとクラスの場合のサンプルプログラムを記載します。
# モジュールを定義 module Hoge end # クラスを定義 class Person def initialize(name, age) @name = name @age = age end end puts Hoge.inspect puts Person.new("tanaka", 25).inspect
実行結果:
Hoge #<Person:0x00000002265de8 @name="tanaka", @age=25>
inspectとto_sの違いとは
inspectメソッドと同様のメソッドが他にもあります。
それはto_sメソッドです。
しかし、細かい部分で挙動が異なってくるので、この項ではinspectメソッドとto_sメソッドの違いを解説いたします。
nilの場合
nilをinspectメソッドとto_sメソッドで出力した場合、両者で異なる出力結果となります。
puts nil.inspect puts nil.to_s
実行結果:
nil
inspectメソッドではnilを文字列として出力しますが、to_sメソッドではそのままnilとして出力しています。
文字列の場合
文字列を指定した場合にも、異なる出力結果となります。
puts "moji".inspect puts "moji".to_s
実行結果:
"moji" moji
文字列を指定してinspectメソッドとto_sメソッドで出力した場合、ダブルクォーテーションの有無の違いが生じます。
クラスの場合
クラスオブジェクトの場合も、inspetメソッドとto_sメソッドに違いが生じます。
class Person def initialize(name, age) @name = name @age = age end end tanaka = Person.new("tanaka", 25) puts tanaka.inspect puts tanaka.to_s
実行結果:
#<Person:0x00000001cdda88 @name="tanaka", @age=25> #<Person:0x00000001cdda88>
inspectメソッドではクラス名とオブジェクトidとインスタンス変数を出力しますが、to_sメソッドはクラス名とオブジェクトidのみ出力しインスタンス変数は出力しません。
このようにinspectメソッドとto_sメソッドでは、同じ「文字列を返す」メソッドでも微妙に違いがあるので使用する際には注意が必要です。
まとめ
この記事では、inspectメソッドの使い方をサンプルプログラムを用いて解説しました。
inspectメソッドは、オブジェクトや配列をわかりやすい文字列で返してくれるメソッドです。
ただ、inspectメソッドとto_sメソッドの違いについて注意しておく必要があります。
デバッグの際にも役に立つメソッドなので、ぜひこの機会にinspectメソッドをマスターしてください!