はじめてのRuby!inspectとは!?使い方を徹底解説!

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メソッドをマスターしてください!

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次