Menu
CoddyTech

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
false

instance_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) }  # لا يشمل أي فئة فرعية
challenge icon

التحدي

سهل

عرّف أصناف الحيوانات: 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}"
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Ruby عبر الإنترنت