Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
object.inspect / class / is_a? / respond_to?
オブジェクトの型や内容を確認するメソッドです。デバッグや動的なメソッド呼び出しに役立ちます。
構文
# オブジェクトのデバッグ用文字列表現を返します。 オブジェクト.inspect # オブジェクトのクラスを返します。 オブジェクト.class # 指定したクラスまたはそのサブクラスのインスタンスか確認します。 オブジェクト.is_a?(クラス) オブジェクト.kind_of?(クラス) # is_a? の別名 # 指定したクラスの直接のインスタンスか確認します(継承は考慮しない)。 オブジェクト.instance_of?(クラス) # 指定したメソッドを持つか確認します。 オブジェクト.respond_to?(:メソッド名)
メソッド一覧
| メソッド | 概要 |
|---|---|
| inspect | オブジェクトの詳細な文字列表現を返します。デバッグ・ログ出力に使います。 |
| class | オブジェクトが属するクラスを返します。 |
| is_a? | 指定クラスまたはその祖先クラスのインスタンスであれば『true』を返します。 |
| instance_of? | 指定クラスの直接のインスタンスであれば『true』を返します。継承を考慮しません。 |
| respond_to? | オブジェクトが指定したメソッドに応答できれば『true』を返します。 |
| nil? | オブジェクトが『nil』であれば『true』を返します。 |
| frozen? | オブジェクトが凍結(変更不可)されていれば『true』を返します。 |
サンプルコード
# class でクラスを確認します。
puts 42.class # Integer
puts "hello".class # String
puts [1, 2, 3].class # Array
puts { a: 1 }.class # Hash
# is_a? で型チェックをします。
puts 42.is_a?(Integer) # true
puts 42.is_a?(Numeric) # true(Integer は Numeric のサブクラス)
puts 42.is_a?(String) # false
# instance_of? は継承を考慮しません。
puts 42.instance_of?(Integer) # true
puts 42.instance_of?(Numeric) # false(直接のインスタンスではない)
# respond_to? でメソッドの存在を確認してから呼び出します。
def 安全に変換する(オブジェクト)
if オブジェクト.respond_to?(:to_i)
オブジェクト.to_i
else
0
end
end
puts 安全に変換する("42") # 42
puts 安全に変換する("abc") # 0
# inspect でデバッグ情報を表示します。
データ = { name: "田中", scores: [85, 92] }
puts データ.inspect # {:name=>"田中", :scores=>[85, 92]}
概要
Rubyではすべてがオブジェクトであり、型確認メソッドはデバッグや多態的な処理に役立ちます。『is_a?』は継承を考慮するため、『42.is_a?(Numeric)』のように親クラスに対しても『true』を返します。
『respond_to?』はダックタイピングと組み合わせて使うことが多く、クラスの種類ではなくメソッドの有無でオブジェクトを扱う判断ができます。型チェックを多用するコードはRubyらしくない場合があります。多くの場面ではダックタイピング(メソッドが使えるかどうかで判断)を優先することをお勧めします。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。