Menu
Coddy logo textTech

משתני מופע

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Ruby של Coddy. שיעור 3 מתוך 57.

משתנה מופע מתחיל ב־@ ושייך לאובייקט אחד. ערך שנשמר ב־initialize נשאר זמין לכל המתודות של אותו אובייקט, ולכל מופע יש עותק משלו:

class Dog
  def initialize(name)
    @name = name
  end

  def speak
    "#{@name} says Woof"
  end
end

rex = Dog.new("Rex")
bella = Dog.new("Bella")
puts rex.speak
puts bella.speak

פלט:

Rex says Woof
Bella says Woof

מתודות יכולות לשנות משתני מופע, כך שאובייקט זוכר מה קרה לו. יחד, משתני המופע שלו הם המצב של האובייקט:

class Counter
  def initialize
    @count = 0
  end

  def increment
    @count += 1
  end

  def report
    "count is #{@count}"
  end
end

clicks = Counter.new
clicks.increment
clicks.increment
puts clicks.report

פלט:

count is 2

אי אפשר לגשת למשתני מופע מחוץ לאובייקט. קוד חיצוני יכול רק לקרוא למתודות, לכן מחלקה שרוצה לשתף ערך מגדירה מתודה שמחזירה אותו, קורא:

class Dog
  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

rex = Dog.new("Rex")
puts rex.name
begin
  rex.age
rescue NoMethodError => e
  puts e.message
end

פלט:

Rex
undefined method `age' for an instance of Dog

משתנה מופע שמעולם לא הוקצה לו ערך הוא nil ואינו גורם לשגיאה, ולכן שם שגוי שנכתב בשגיאת כתיב נקרא בשקט כמשתנה ריק אחר. instance_variables מציג את המשתנים שיש לאובייקט בפועל:

class Lamp
  def initialize
    @on = false
  end

  def status
    @onn.inspect
  end
end

lamp = Lamp.new
puts lamp.status
p lamp.instance_variables

פלט:

nil
[:@on]
challenge icon

אתגר

קל

השלם את המחלקה Pet. initialize(name, species, age) שומר את שלושת הערכים, birthday מוסיף שנה אחת לגיל, ו-describe מחזירה משפט אחד: חיית מחמד בשם Rex, ממין dog, ובגיל 3 נותנת Rex is a 3 year old dog.

הקוד שסופק יוצר Pet משלוש שורות הקלט הראשונות (שם, מין, גיל), קורא ל-birthday כמספר הפעמים שמצוין בשורה הרביעית ומדפיס את describe.

הקוד שלך נכנס ל-pet.rb. הקובץ main.rb מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.

נסו בעצמכם

require_relative 'pet'

# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input = []
while (line = gets)
  input << line.chomp
end
pet = Pet.new(input[0], input[1], input[2].to_i)
input[3].to_i.times { pet.birthday }
puts pet.describe
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Ruby אונליין