קבועים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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אתגר
קלהשלימו את המחלקה 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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
3מתודות ומשתנים של מחלקה
מתודות של מחלקהמשתני מופע של מחלקהקבועיםמתודות ליצירת מופעיםסיכום – קודי קופוןתרגלו בעצמכם: קומפיילר Ruby אונליין