متغيرات كائنات الأصناف
جزء من قسم البرمجة كائنية التوجه في رحلة Ruby على Coddy. الدرس 13 من 57.
الفئة هي كائن أيضًا، لذا يمكن أن تكون لها متغيرات مثيل خاصة بها. ينتمي @issued = 0 في جسم الفئة، حيث يكون self هو الفئة، إلى الفئة وليس إلى أي مثيل. تقرأ أساليب الفئة هذه القيمة وتغيّرها:
class Ticket
@issued = 0
def self.issue
@issued += 1
end
def self.issued
@issued
end
end
Ticket.issue
Ticket.issue
puts Ticket.issuedالناتج:
2ينشئ attr_accessor داخل class << self قارئًا ومُعيِّنًا للصنف. تصل المثيلات بعد ذلك إلى حالة الصنف من خلال self.class، مثلًا لعدّ كل كائن تنشئه new:
class Robot
@built = 0
class << self
attr_accessor :built
end
attr_reader :serial
def initialize
self.class.built += 1
@serial = self.class.built
end
end
a = Robot.new
b = Robot.new
puts "#{a.serial} #{b.serial} #{Robot.built}"الناتج:
1 2 2تحتوي Ruby أيضًا على متغيرات الأصناف، وتُكتب بالشكل @@name. يُشارك متغير الصنف بين الصنف وجميع نسخه، لذا يمكن لطرائق النسخ قراءته مباشرةً:
class Player
@@count = 0
def initialize
@@count += 1
end
def self.count
@@count
end
def others
@@count - 1
end
end
Player.new
last = Player.new
puts Player.count
puts last.othersالمخرجات:
2
1يتم أيضًا مشاركة متغير الصنف مع كل صنف فرعي (وهو صنف مبني على صنف آخر، الفصل 5)، لذلك فإن الصنف الفرعي الذي يعيّن قيمة له يغيّرها للصنف الأب أيضًا. بينما يظل متغير مثيل الصنف منفصلًا لكل صنف، ولهذا تفضّله معظم شفرات Ruby:
class Base
@@kind = "base"
@label = "base"
class << self
attr_reader :label
end
def self.kind
@@kind
end
end
class Child < Base
@@kind = "child"
@label = "child"
end
puts Base.kind
puts Base.label
puts Child.labelالناتج:
child
base
childالتحدي
سهلأكمل الصنف Ticket. يحصل كل تذكرة جديدة على الرقم التالي، بدءًا من 1، من عدّاد محفوظ في متغير مثيل للصنف. تُرجع Ticket.issued عدد التذاكر التي أُصدرت منذ آخر إعادة ضبط، وتعيد Ticket.reset العدّاد إلى 0. تُرجع to_s القيمة #3 Concert.
يقرأ الكود المزوَّد الأسطر. تعيد reset ضبط العدّاد؛ وأي سطر آخر هو اسم فعالية، ينشئ تذكرةً له ويطبعها. وفي النهاية يطبع issued: 2.
ضع كودك في ticket.rb. يحتوي main.rb على كود الإدخال/الإخراج المزوَّد، ولا يمكن تعديله.
جرّب بنفسك
require_relative 'ticket'
# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input = []
while (line = gets)
input << line.chomp
end
input.each do |line|
if line == "reset"
Ticket.reset
else
puts Ticket.new(line)
end
end
puts "issued: #{Ticket.issued}"
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت