is_a?と祖先
CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 25/57。
is_a?(Class) は、オブジェクトがそのクラスまたはそのサブクラスのインスタンスかどうかを確認します。kind_of? は同じメソッドの別名です。
class Animal
end
class Dog < Animal
end
rex = Dog.new
puts rex.is_a?(Dog)
puts rex.is_a?(Animal)
puts rex.is_a?(Object)
puts rex.kind_of?(String)出力:
true
true
true
falseinstance_of? はより厳密です。オブジェクト自身のクラスに対してのみ true になります。obj.class はそのクラスを返します。
class Animal
end
class Dog < Animal
end
rex = Dog.new
puts rex.instance_of?(Dog)
puts rex.instance_of?(Animal)
puts rex.class出力:
true
false
Dogancestors は、Ruby がメソッドを検索するクラスを、クラス自身から始めて一覧表示します。完全な一覧には、第6章で扱う Kernel などのモジュールも含まれるため、take(3) は最初の項目を表示します。クラスは比較できます。Dog < Animal は、Dog が Animal を継承している場合に true になります。
class Animal
end
class Dog < Animal
end
p Dog.ancestors.take(3)
puts Dog < Animal
puts Animal < Dog出力:
[Dog, Animal, Object]
true
falseコードでクラスのグループを同じように扱う必要がある場合は、is_a? を使用します。たとえば、どのサブクラスであるかにかかわらず、すべての哺乳類を数える場合です。instance_of? で完全に一致するクラスを尋ねると、誰かがサブクラスを追加した途端に機能しなくなります。
mammals = animals.count { |a| a.is_a?(Mammal) } # 犬、コウモリ、クジラ...
exact = animals.count { |a| a.instance_of?(Mammal) } # すべてのサブクラスを見逃すチャレンジ
簡単動物のクラスを宣言します:Animal、Mammal < Animal、Bird < Animal、Dog < Mammal、Bat < Mammal、Penguin < Bird。Animalは名前を保持します。次に、functions.rbのヘルパーdescribe(animal)を完成させます。このヘルパーは、クラス名を小文字にし、is_a?によってグループを決定して、Rex is a dog: mammal、Pingu is a penguin: birdを返します。
提供されたコードは行dog Rexを読み込み、オブジェクトを作成し、それぞれについてdescribeを出力した後、mammals: 2, birds: 1を出力します。
コードはanimal.rb、mammal.rb、bird.rb、dog.rb、bat.rb、penguin.rb、functions.rbに記述します。main.rbには提供された入出力コードが含まれており、編集できません。
自分で試してみよう
require_relative 'animal'
require_relative 'mammal'
require_relative 'bird'
require_relative 'dog'
require_relative 'bat'
require_relative 'penguin'
require_relative 'functions'
# 提供された入力/出力コード: そのままにしておく
input = []
while (line = gets)
input << line.chomp
end
kinds = { "dog" => "Dog", "bat" => "Bat", "penguin" => "Penguin" }
animals = input.map do |line|
kind, name = line.split
Object.const_get(kinds[kind]).new(name)
end
animals.each { |a| puts describe(a) }
mammals = animals.count { |a| a.is_a?(Mammal) }
birds = animals.count { |a| a.is_a?(Bird) }
puts "mammals: #{mammals}, birds: #{birds}"
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ