Menu
Coddy logo textTech

מגדירים מותאמים אישית

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

אתגר

קל

השלימו את המחלקה 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
quiz iconבחנו את עצמכם

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

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

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