is_a? i przodkowie
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 25 z 57.
is_a?(Class) sprawdza, czy obiekt jest instancją tej klasy lub dowolnej jej podklasy. kind_of? to inna nazwa tej samej metody:
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)Wynik:
true
true
true
falseinstance_of? jest bardziej rygorystyczne: zwraca true tylko dla własnej klasy obiektu. obj.class zwraca tę klasę:
class Animal
end
class Dog < Animal
end
rex = Dog.new
puts rex.instance_of?(Dog)
puts rex.instance_of?(Animal)
puts rex.classWynik:
true
false
Dogancestors wyświetla klasy, w których Ruby szuka metod, zaczynając od samej klasy; pełna lista zawiera również moduły, takie jak Kernel, które omawia rozdział 6, dlatego take(3) pokazuje pierwsze elementy. Klasy można porównywać: Dog < Animal ma wartość true, gdy Dog dziedziczy po Animal:
class Animal
end
class Dog < Animal
end
p Dog.ancestors.take(3)
puts Dog < Animal
puts Animal < DogWynik:
[Dog, Animal, Object]
true
falseUżyj is_a?, gdy kod ma traktować grupę klas w ten sam sposób, na przykład zliczać wszystkie ssaki, niezależnie od tego, jakiej są podklasy. Sprawdzanie jednej konkretnej klasy za pomocą instance_of? przestaje działać, gdy tylko ktoś doda podklasę:
mammals = animals.count { |a| a.is_a?(Mammal) } # psy, nietoperze, wieloryby...
exact = animals.count { |a| a.instance_of?(Mammal) } # pomija każdą podklasęWyzwanie
ŁatwyZadeklaruj klasy zwierząt: Animal, Mammal < Animal, Bird < Animal, Dog < Mammal, Bat < Mammal i Penguin < Bird. Animal przechowuje imię. Następnie uzupełnij funkcję pomocniczą describe(animal) w pliku functions.rb: zwraca Rex is a dog: mammal, Pingu is a penguin: bird, z nazwą klasy zapisaną małymi literami i grupą określaną za pomocą is_a?.
Dostarczony kod odczytuje wiersze dog Rex, tworzy obiekty, wypisuje wynik describe dla każdego z nich, a następnie mammals: 2, birds: 1.
Umieść swój kod w plikach animal.rb, mammal.rb, bird.rb, dog.rb, bat.rb, penguin.rb i functions.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'animal'
require_relative 'mammal'
require_relative 'bird'
require_relative 'dog'
require_relative 'bat'
require_relative 'penguin'
require_relative 'functions'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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}"
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasZmienne instancjiMetody i selfto_s i inspectPowtórzenie – karta biblioteczna4Hermetyzacja
Metody prywatneMetody chronionePrywatne setteryOchrona stanuPowtórzenie – automat vendingowy7Polimorfizm i typowanie kacze
PolimorfizmTypowanie kaczeMetody abstrakcyjnecase i klasyPowtórzenie – metody płatności10Wzorce projektowe, część 2
Delegowanie z ForwardableWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Metody dostępowe i self
Gettery i setteryWłasne setteryself w metodachTożsamość i równośćPowtórzenie – lista kontaktów5Dziedziczenie
PodklasyNadpisywanie metodWywoływanie superis_a? i przodkowiePowtórka – lista płac pracowników8Metody specjalne
Równość i hashMetody operatorówIndeksowanie i dodawanieWłasne kolekcjePowtórka – ułamki11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Kompilator Ruby online