Menu
Coddy logo textTech

מתודות של מחלקה

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

class << 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
challenge icon

אתגר

קל

השלימו את המתודות של המחלקה 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) }
quiz iconבחנו את עצמכם

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

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

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