Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

متغيرات كائنات الأصناف

جزء من قسم البرمجة كائنية التوجه في رحلة 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
challenge icon

التحدي

سهل

أكمل الصنف 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}"
quiz iconاختبر نفسك

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

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

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