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