Menu
Coddy logo textTech

קבועים

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