מתודות של מחלקה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Ruby של Coddy. שיעור 12 מתוך 57.
מתודת מחלקה שייכת למחלקה, ולא למופע מסוים. בגוף המחלקה self היא המחלקה, ולכן def self.name מגדיר מתודה במחלקה. קוראים לה במחלקה עצמה:
class Temperature
def self.to_fahrenheit(celsius)
celsius * 9 / 5.0 + 32
end
end
puts Temperature.to_fahrenheit(100)
puts Temperature.to_fahrenheit(-40)פלט:
212.0
-40.0מתודות מחלקה ומתודות מופע נמצאות במקומות שונים. מופע לא יכול לקרוא למתודת מחלקה ישירות; הוא מגיע אליה דרך self.class או דרך שם המחלקה:
class Circle
def self.area_for(r)
(3.14159 * r * r).round(2)
end
def initialize(r)
@r = r
end
def area
self.class.area_for(@r)
end
end
puts Circle.area_for(1)
puts Circle.new(2).area
begin
Circle.new(2).area_for(2)
rescue NoMethodError => e
puts e.message
endפלט:
3.14
12.57
undefined method `area_for' for an instance of Circleclass << self פותח מקטע בגוף המחלקה שבו כל def היא מתודת מחלקה. כך נחסך הצורך לכתוב self. כאשר למחלקה יש כמה מתודות כאלה:
class Units
class << self
def km_to_miles(km)
(km * 0.621371).round(1)
end
def miles_to_km(miles)
(miles / 0.621371).round(1)
end
end
end
puts Units.km_to_miles(10)
puts Units.miles_to_km(26.2)פלט:
6.2
42.2השתמשו בשיטת מחלקה עבור פעולות ששייכות לסוג הדבר ולא לאובייקט אחד: המרת יחידות, ניתוח טקסט לאובייקט או שמירה על ספירה של כל המופעים. פעולות שזקוקות לנתונים של אובייקט אחד נשארות שיטות מופע:
class Invoice
def self.tax_rate # זהה לכל חשבונית
0.2
end
def tax # זקוק לסכום של החשבונית הזו
@amount * Invoice.tax_rate
end
endאתגר
קלהשלימו את המתודות של המחלקה Temperature. המתודות to_fahrenheit(c) ו־to_celsius(f) ממירות ערך. המתודה feel(celsius) מחזירה freezing מתחת ל־0, cold מתחת ל־15, mild מתחת ל־25 ו־hot בכל מקרה אחר. המתודה convert(text) מקבלת טקסט כגון 20 C או 68 F ומחזירה 20.0 C = 68.0 F (mild) או 68.0 F = 20.0 C (mild), עם ספרה אחת אחרי הנקודה העשרונית ועם התחושה המתאימה לערך במעלות צלזיוס; היא משתמשת בשאר המתודות של המחלקה.
הקוד שסופק קורא ל־Temperature.convert(line) עבור כל שורת קלט ומדפיס את התוצאה. לא נוצרת אף מופע של Temperature.
הקוד שלך צריך להיכתב בקובץ temperature.rb. הקובץ main.rb מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
require_relative 'temperature'
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input = []
while (line = gets)
input << line.chomp
end
input.each { |line| puts Temperature.convert(line) }
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
3מתודות ומשתנים של מחלקה
מתודות של מחלקהמשתני מופע של מחלקהקבועיםמתודות ליצירת מופעיםסיכום – קודי קופוןתרגלו בעצמכם: קומפיילר Ruby אונליין