מגדירים מותאמים אישית
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Ruby של Coddy. שיעור 8 מתוך 57.
setter הוא מתודה שהשם שלה מסתיים ב־=. כתיבתה בעצמך במקום שימוש ב־attr_writer מאפשרת לה לנקות את הערך לפני אחסונו:
class Person
attr_reader :name
def name=(value)
@name = value.strip.capitalize
end
end
ada = Person.new
ada.name = " aDA "
puts "[#{ada.name}]"פלט:
[Ada]סַדְרָן יכול גם לדחות ערך באמצעות העלאת שגיאה. המשתנה של המופע מקבל ערך רק כשהערך עובר את הבדיקה, כך שהאובייקט שומר על מצבו הקודם:
class Product
attr_reader :price
def initialize(price)
@price = price
end
def price=(value)
raise ArgumentError, "price must be positive, got #{value}" if value <= 0
@price = value
end
end
item = Product.new(10)
begin
item.price = -5
rescue ArgumentError => e
puts e.message
end
puts item.priceפלט:
price must be positive, got -5
10ביטוי השמה תמיד מחזיר את הערך שבצדו הימני, ולא את מה שה־setter מחזיר או מאחסן. קרא שוב את המאפיין כדי לראות את הערך המאוחסן:
class Thermometer
attr_reader :celsius
def celsius=(value)
@celsius = value.round
end
end
t = Thermometer.new
result = (t.celsius = 21.7)
puts result
puts t.celsiusפלט:
21.7
22קורא ומגדיר מותאם אישית יחד מספקים מאפיין שקוד חיצוני יכול לקרוא ולשנות, אבל רק לערכים תקינים. השאירו את הבדיקה רק במגדיר, כדי שכל שינוי יעבור דרך אותו כלל:
class Volume
attr_reader :level
def level=(value)
raise ArgumentError, "level must be 0-10" unless (0..10).cover?(value)
@level = value
end
endאתגר
קלהשלימו את המחלקה Person. הקובע שלה name= מסיר רווחים מסביב לערך והופך את האות הראשונה בכל מילה לאות גדולה ( ada lovelace הופך ל־Ada Lovelace). הקובע שלה age= מעלה ArgumentError עם ההודעה invalid age: 200 כאשר הגיל אינו בטווח 0 עד 150, ובמקרה אחר שומר אותו. אפשר לקרוא את שני הערכים.
אובייקט חדש של Person מתחיל עם השם Unknown והגיל 0. הקוד שסופק קורא פקודות name text או age n, מחיל אותן באמצעות הקובעים ומדפיס את האדם בצורה Ada Lovelace (36) אחרי כל פקודה, או את הודעת השגיאה כשהקובע מסרב לערך.
הקוד שלך ייכתב ב־person.rb. הקובץ main.rb מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
require_relative 'person'
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input = []
while (line = gets)
input << line.chomp
end
person = Person.new
input.each do |line|
command, value = line.split(" ", 2)
begin
command == "name" ? person.name = value : person.age = value.to_i
puts "#{person.name} (#{person.age})"
rescue ArgumentError => e
puts e.message
end
end
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
3מתודות ומשתנים של מחלקה
מתודות של מחלקהמשתני מופע של מחלקהקבועיםמתודות ליצירת מופעיםסיכום – קודי קופוןתרגלו בעצמכם: קומפיילר Ruby אונליין