משתני מופע של מחלקה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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פלט:
2attr_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}"
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
3מתודות ומשתנים של מחלקה
מתודות של מחלקהמשתני מופע של מחלקהקבועיםמתודות ליצירת מופעיםסיכום – קודי קופוןתרגלו בעצמכם: קומפיילר Ruby אונליין