Menu
Coddy logo textTech

קוראים וכותבים

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

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

class Book
  attr_reader :title, :pages

  def initialize(title, pages)
    @title = title
    @pages = pages
  end
end

book = Book.new("Dune", 412)
puts book.title
puts book.pages

פלט:

Dune
412

attr_writer :title יוצר setter, את המתודה title=, ששומרת את הארגומנט שלה בתוך @title. Ruby מאפשרת לקרוא לה באמצעות תחביר השמה, book.title = "Emma":

class Book
  attr_reader :title
  attr_writer :title

  def initialize(title)
    @title = title
  end
end

book = Book.new("Dune")
book.title = "Dune Messiah"
puts book.title

פלט:

Dune Messiah

attr_accessor יוצר גם את פעולת הקריאה וגם את פעולת ההשמה. כששתיהן זמינות, גם קיצור כמו += עובד, כי player.score += 5 פירושו player.score = player.score + 5:

class Player
  attr_accessor :name, :score

  def initialize(name)
    @name = name
    @score = 0
  end
end

ada = Player.new("Ada")
ada.score += 5
ada.score += 3
ada.name = "Ada L."
puts "#{ada.name}: #{ada.score}"

פלט:

Ada L.: 8

חשוף כמה שפחות. השתמשו ב־attr_reader עבור ערכים שקוד חיצוני עשוי לקרוא אך לא לשנות, והוסיפו כותב רק כאשר שינוי הערך מבחוץ הוא חלק מהתכנון. השמה למאפיין שמוגדר לקריאה בלבד מעלה NoMethodError:

class Book
  attr_reader :title

  def initialize(title)
    @title = title
  end
end

book = Book.new("Dune")
begin
  book.title = "Emma"
rescue NoMethodError => e
  puts e.message
end
puts book.title

פלט:

undefined method `title=' for an instance of Book
Dune
challenge icon

אתגר

קל

השלם את המחלקה Book. קוד חיצוני יכול לקרוא את title, את author ואת pages, והוא יכול לקרוא ולשנות את pages_read, שמתחיל ב־0. progress מחזירה את Dune: 120/412 (29%), כשהאחוז מעוגל כלפי מטה.

הקוד שסופק יוצר ספר משלוש שורות הקלט הראשונות (כותרת, מחבר, מספר עמודים). כל שורה שאחריה מציינת את מספר העמודים שהקורא הספיק לקרוא; הקוד מוסיף כל מספר באמצעות book.pages_read += n. לבסוף הוא מדפיס את Dune by Frank Herbert ואת ההתקדמות.

הקוד שלך צריך להופיע ב־book.rb. הקובץ main.rb מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.

נסו בעצמכם

require_relative 'book'

# קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input = []
while (line = gets)
  input << line.chomp
end
book = Book.new(input[0], input[1], input[2].to_i)
input.drop(3).each { |n| book.pages_read += n.to_i }
puts "#{book.title} by #{book.author}"
puts book.progress
quiz iconבחנו את עצמכם

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

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

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