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