object.inspect / class / is_a? / respond_to?
| 対応: | Ruby 1.8(2003) |
|---|
オブジェクトの型や内容を確認するメソッドです。デバッグや動的なメソッド呼び出しに役立ちます。
構文
# オブジェクトのデバッグ用文字列表現を返します オブジェクト.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』を返します。 |
サンプルコード
sample_object_inspect_class_is_a.rb
# 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 safe_convert(obj)
if obj.respond_to?(:to_i)
obj.to_i
else
0
end
end
puts safe_convert("42") # 42
puts safe_convert("abc") # 0
# inspect でデバッグ情報を表示します
data = { name: "孫悟空", org: "カプセルコーポレーション", power: [9000, 99999] }
puts data.inspect # {:name=>"孫悟空", :org=>"カプセルコーポレーション", :power=>[9000, 99999]}
object_inspect_class_is_a.rb
ruby object_inspect_class_is_a.rb
Integer
String
Array
Hash
true
true
false
true
false
42
0
{:name=>"孫悟空", :org=>"カプセルコーポレーション", :power=>[9000, 99999]}
概要
Rubyではすべてがオブジェクトであり、型確認メソッドはデバッグや多態的な処理に役立ちます。『is_a?』は継承を考慮するため、『42.is_a?(Numeric)』のように親クラスに対しても『true』を返します。
『respond_to?』はダックタイピングと組み合わせて使うことが多く、クラスの種類ではなくメソッドの有無でオブジェクトを扱う判断ができます。型チェックを多用するコードはRubyらしくない場合があります。多くの場面ではダックタイピング(メソッドが使えるかどうかで判断)を優先することをお勧めします。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。