Menu
Coddy logo textTech

משתני מופע של מחלקה

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 אונליין