Menu
CoddyTech

קבועים

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

קבוע מתחיל באות גדולה ועל פי המוסכמה נכתב באותיות גדולות. אם הוא מוגדר בגוף של מחלקה, אפשר להשתמש בו לפי שמו בכל מתודה של המחלקה. מחוץ למחלקה כותבים ClassName::NAME:

class Account
  MIN_BALANCE = -100

  def self.allowed?(balance)
    balance >= MIN_BALANCE
  end
end

puts Account::MIN_BALANCE
puts Account.allowed?(-50)
puts Account.allowed?(-150)

פלט:

-100
true
false

קבועים מתאימים לנתונים קבועים שמשמשים את המחלקה כולה, כמו מגבלות או טבלאות חיפוש. קריאה ל-fetch על קבוע מסוג hash מעלה KeyError כשמפתח לא מוכר, במקום להחזיר בשקט nil:

class Shipping
  RATES = { "standard" => 5, "express" => 12 }.freeze

  def self.cost(method)
    RATES.fetch(method)
  end
end

puts Shipping.cost("express")
begin
  Shipping.cost("drone")
rescue KeyError => e
  puts e.message
end

פלט:

12
key not found: "drone"

לא ניתן להפנות שם של קבוע לאובייקט חדש בלי ש-Ruby תציג אזהרה, אבל עדיין אפשר לשנות את האובייקט שהוא מכיל. freeze הופכת את האובייקט עצמו לקריאה בלבד, ולכן שינוי מעלה את FrozenError:

class Palette
  COLORS = ["red", "green"].freeze
end

begin
  Palette::COLORS << "blue"
rescue FrozenError => e
  puts e.message
end
p Palette::COLORS
p Palette::COLORS.frozen?

פלט:

can't modify frozen Array: ["red", "green"]
["red", "green"]
true

בחר לפי אופן ההתנהגות של הערך. ערך שלעולם אינו משתנה שייך לקבוע מוקפא; מצב שמשתנה בזמן שהתוכנית רצה, כמו מונה, שייך למשתנה מופע של מחלקה:

class Ticket
  PREFIX = "TK"                  # קבוע: ערך קבוע
  @issued = 0                    # משתנה: משתנה מופע של המחלקה

  def self.next_code
    @issued += 1
    "#{PREFIX}-#{@issued}"
  end
end
challenge icon

אתגר

קל

השלימו את המחלקה Order. יש בה את הקבועים RATES (hash קפוא: standard עולה 5, express עולה 12, pickup עולה 0) ואת FREE_FROM (50). initialize(total, method) מעלה את ArgumentError עם unknown shipping: drone כאשר method אינו מפתח של RATES. shipping מחזירה 0 עבור סכומים ששווים ל-FREE_FROM או גבוהים ממנו, ואת התעריף אחרת, ואילו to_s מחזירה 40.00 + 5 express = 45.00.

הקוד שסופק מדפיס free from 50 באמצעות הקבוע, ואז קורא הזמנות כשורות בפורמט total method ומדפיס כל הזמנה או את הודעת השגיאה.

יש לכתוב את הקוד שלכם ב-order.rb. הקובץ main.rb מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.

נסו בעצמכם

require_relative 'order'

# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input = []
while (line = gets)
  input << line.chomp
end
puts "free from #{Order::FREE_FROM}"
input.each do |line|
  total, method = line.split
  begin
    puts Order.new(total.to_f, method)
  rescue ArgumentError => e
    puts e.message
  end
end
quiz iconבחנו את עצמכם

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

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

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