is_a? dan ancestors
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 25 dari 57.
is_a?(Class) memeriksa apakah sebuah object merupakan instance dari class tersebut atau salah satu subclass-nya. kind_of? adalah nama lain untuk method yang sama:
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? lebih ketat: hasilnya hanya true untuk class milik object itu sendiri. obj.class mengembalikan class tersebut:
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 mencantumkan class yang dicari Ruby untuk menemukan method, dimulai dari class itu sendiri; daftar lengkapnya juga memuat module seperti Kernel, yang dibahas di bab 6, jadi take(3) menampilkan entri pertama. Class bisa dibandingkan: Dog < Animal bernilai true ketika Dog mewarisi dari Animal:
class Animal
end
class Dog < Animal
end
p Dog.ancestors.take(3)
puts Dog < Animal
puts Animal < DogOutput:
[Dog, Animal, Object]
true
falseGunakan is_a? saat kodemu harus memperlakukan sekelompok class dengan cara yang sama, misalnya untuk menghitung semua mamalia, apa pun subclass-nya. Meminta satu class yang persis dengan instance_of? akan bermasalah begitu seseorang menambahkan subclass:
mammals = animals.count { |a| a.is_a?(Mammal) } # anjing, kelelawar, paus...
exact = animals.count { |a| a.instance_of?(Mammal) } # tidak menghitung satu pun subclassTantangan
MudahDeklarasikan class hewan: Animal, Mammal < Animal, Bird < Animal, Dog < Mammal, Bat < Mammal dan Penguin < Bird. Animal menyimpan nama. Lalu lengkapi helper describe(animal) di functions.rb: fungsi ini mengembalikan Rex is a dog: mammal, Pingu is a penguin: bird, dengan nama class dalam huruf kecil dan grup ditentukan menggunakan is_a?.
Kode yang disediakan membaca baris dog Rex, membuat object, mencetak describe untuk masing-masing, lalu mammals: 2, birds: 1.
Kodemu ditulis di animal.rb, mammal.rb, bird.rb, dog.rb, bat.rb, penguin.rb dan functions.rb. main.rb berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
require_relative 'animal'
require_relative 'mammal'
require_relative 'bird'
require_relative 'dog'
require_relative 'bat'
require_relative 'penguin'
require_relative 'functions'
# Kode input/output yang disediakan: biarkan apa adanya
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}"
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1class dan object
Bekerja dengan fileMendefinisikan classVariabel instansmethod dan selfto_s dan inspectRingkasan: Kartu Perpustakaan4Enkapsulasi
private methodprotected methodprivate setterMelindungi StatusUlasan, Mesin Penjual Otomatis7Polimorfisme dan Duck Typing
PolimorfismeDuck TypingMethod Abstrakcase dan classRingkasan: Method Pembayaran2Accessor dan self
Pembaca dan PenulisSetter Kustomself dalam methodIdentitas dan KesetaraanRangkuman: Daftar Kontak8Special method
Kesetaraan dan hashOperator methodPengindeksan dan penambahanKoleksi kustomRingkasan: Pecahan11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam Buku3Method dan Variabel class
Method classVariabel instance classKonstantaMethod pabrikRangkuman: Kode KuponLatihan sendiri: Compiler Ruby online