is_a? والأسلاف
جزء من قسم البرمجة كائنية التوجه في رحلة Ruby على Coddy. الدرس 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
Dogتعرض ancestors الفئات التي يبحث فيها Ruby عن الأساليب، بدءًا بالفئة نفسها؛ وتتضمن القائمة الكاملة أيضًا وحدات مثل Kernel، التي يتناولها الفصل 6، لذا تعرض take(3) العناصر الأولى. يمكن مقارنة الفئات: تكون Dog < Animal true عندما ترث Dog من Animal:
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 اسمًا. ثم أكمل الدالة المساعدة describe(animal) في functions.rb: فهي تُرجع Rex is a dog: mammal، Pingu is a penguin: bird، مع اسم الصنف بأحرف صغيرة وتحديد المجموعة باستخدام is_a?.
يقرأ الكود المتوفر الأسطر 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}"
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت