is_a? e antenati
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 25 di 57.
is_a?(Class) verifica se un oggetto è un'istanza di quella classe o di una sua sottoclasse. kind_of? è un altro nome per lo stesso metodo:
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)Output:
true
true
true
falseinstance_of? è più rigoroso: è true solo per la classe propria dell'oggetto. obj.class restituisce quella classe:
class Animal
end
class Dog < Animal
end
rex = Dog.new
puts rex.instance_of?(Dog)
puts rex.instance_of?(Animal)
puts rex.classOutput:
true
false
Dogancestors elenca le classi in cui Ruby cerca i metodi, iniziando dalla classe stessa; l’elenco completo contiene anche moduli come Kernel, trattato nel capitolo 6, quindi take(3) mostra le prime voci. Le classi si possono confrontare: Dog < Animal è true quando Dog eredita da Animal:
class Animal
end
class Dog < Animal
end
p Dog.ancestors.take(3)
puts Dog < Animal
puts Animal < DogRisultato:
[Dog, Animal, Object]
true
falseUsa is_a? quando il codice deve trattare un gruppo di classi allo stesso modo, per esempio per contare tutti i mammiferi, indipendentemente dalla sottoclasse a cui appartengono. Richiedere una classe esatta con instance_of? non funziona più non appena qualcuno aggiunge una sottoclasse:
mammals = animals.count { |a| a.is_a?(Mammal) } # cani, pipistrelli, balene...
exact = animals.count { |a| a.instance_of?(Mammal) } # non considera nessuna sottoclasseSfida
FacileDichiara le classi degli animali: Animal, Mammal < Animal, Bird < Animal, Dog < Mammal, Bat < Mammal e Penguin < Bird. Animal memorizza un nome. Poi completa la funzione di supporto describe(animal) in functions.rb: restituisce Rex is a dog: mammal, Pingu is a penguin: bird, con il nome della classe in minuscolo e il gruppo determinato con is_a?.
Il codice fornito legge righe dog Rex, crea gli oggetti, stampa describe per ciascuno e poi mammals: 2, birds: 1.
Il tuo codice va inserito in animal.rb, mammal.rb, bird.rb, dog.rb, bat.rb, penguin.rb e functions.rb. main.rb contiene il codice fornito per input/output e non può essere modificato.
Provalo tu
require_relative 'animal'
require_relative 'mammal'
require_relative 'bird'
require_relative 'dog'
require_relative 'bat'
require_relative 'penguin'
require_relative 'functions'
# Codice di input/output fornito: lascialo così com'è
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}"
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libriEsercitati da solo: Compilatore Ruby online