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