is_a? e ancestrais
Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 25 de 57.
is_a?(Class) verifica se um objeto é uma instância dessa classe ou de qualquer subclasse dela. kind_of? é outro nome para o mesmo método:
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)Saída:
true
true
true
falseinstance_of? é mais rigoroso: só é true para a própria classe do objeto. obj.class retorna essa classe:
class Animal
end
class Dog < Animal
end
rex = Dog.new
puts rex.instance_of?(Dog)
puts rex.instance_of?(Animal)
puts rex.classSaída:
true
false
Dogancestors lista as classes nas quais o Ruby procura métodos, começando pela própria classe; a lista completa também contém módulos como Kernel, que o capítulo 6 aborda, portanto take(3) mostra as primeiras entradas. As classes podem ser comparadas: Dog < Animal é true quando Dog herda de Animal:
class Animal
end
class Dog < Animal
end
p Dog.ancestors.take(3)
puts Dog < Animal
puts Animal < DogSaída:
[Dog, Animal, Object]
true
falseUse is_a? quando o código precisar tratar um grupo de classes da mesma maneira, por exemplo, para contar todos os mamíferos, independentemente da subclasse à qual pertençam. Verificar uma única classe exata com instance_of? deixa de funcionar assim que alguém adiciona uma subclasse:
mammals = animals.count { |a| a.is_a?(Mammal) } # cães, morcegos, baleias...
exact = animals.count { |a| a.instance_of?(Mammal) } # perde todas as subclassesDesafio
FácilDeclare as classes de animais: Animal, Mammal < Animal, Bird < Animal, Dog < Mammal, Bat < Mammal e Penguin < Bird. Animal armazena um nome. Em seguida, complete o auxiliar describe(animal) em functions.rb: ele retorna Rex is a dog: mammal, Pingu is a penguin: bird, com o nome da classe em letras minúsculas e o grupo determinado com is_a?.
O código fornecido lê linhas dog Rex, cria os objetos, imprime describe para cada um e, em seguida, mammals: 2, birds: 1.
Seu código deve ser colocado em animal.rb, mammal.rb, bird.rb, dog.rb, bat.rb, penguin.rb e functions.rb. main.rb contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
require_relative 'animal'
require_relative 'mammal'
require_relative 'bird'
require_relative 'dog'
require_relative 'bat'
require_relative 'penguin'
require_relative 'functions'
# Código de entrada/saída fornecido: mantenha-o como está
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}"
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação orientada a objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesVariáveis de InstânciaMétodos e selfto_s e inspectRevisão - Cartão da Biblioteca4Encapsulamento
Métodos privadosMétodos protegidosSetters privadosProtegendo o estadoRevisão - Máquina de venda automática7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMétodos Abstratoscase e ClassesRevisão - Métodos de Pagamento2Acessores e self
Leitores e GravadoresSetters Personalizadosself nos MétodosIdentidade e IgualdadeRecapitulação - Lista de Contatos5Herança
SubclassesSobrescrita de métodosChamando superis_a? e ancestraisRevisão - Folha de pagamento da equipe8Métodos Especiais
Igualdade e hashMétodos de OperadoresIndexação e AdiçãoColeções PersonalizadasRevisão - Frações11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de Ruby online