מתודות ו־self
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Ruby של Coddy. שיעור 4 מתוך 57.
מתודה יכולה לקרוא למתודה אחרת של אותו אובייקט בלי לכתוב מקבל. Ruby שולחת את הקריאה לאובייקט הנוכחי, כך שמתודות בונות זו על גבי זו:
class Order
def initialize(price, quantity)
@price = price
@quantity = quantity
end
def subtotal
@price * @quantity
end
def shipping
subtotal >= 50 ? 0 : 5
end
def total
subtotal + shipping
end
end
puts Order.new(10, 3).total
puts Order.new(20, 3).totalפלט:
35
60בתוך מתודה, self הוא האובייקט שעליו נקראה המתודה. מתודה שמחזירה את self מאפשרת למי שקורא לה לשרשר כמה קריאות על אותו אובייקט:
class Counter
def initialize
@count = 0
end
def add(n)
@count += n
self
end
def count
@count
end
end
puts Counter.new.add(2).add(5).countפלט:
7אובייקט יכול גם להעביר את עצמו לקוד אחר באמצעות self, למשל כדי להחזיר את המנצח בהשוואה לאובייקט אחר מאותה מחלקה:
class Player
def initialize(name, score)
@name = name
@score = score
end
def name
@name
end
def score
@score
end
def winner_against(other)
score >= other.score ? self : other
end
end
ada = Player.new("Ada", 9)
bo = Player.new("Bo", 7)
puts ada.winner_against(bo).name
puts bo.winner_against(ada).nameפלט:
Ada
Adaשמות של מתודות שעונות על שאלת כן או לא מסתיימים ב־?, כמו empty?. לפרמטרים יכולים להיות ערכי ברירת מחדל, שבהם נעשה שימוש כשהקורא לא מעביר את הארגומנט:
class Kettle
def initialize
@temp = 20
end
def hot?
@temp >= 90
end
def heat(degrees = 10)
@temp = [@temp + degrees, 100].min
end
end
k = Kettle.new
k.heat
puts k.hot?
k.heat(75)
puts k.hot?פלט:
false
trueאתגר
קלהשלם את המחלקה ShoppingCart. add(name, price) שומרת פריט ומחזירה את העגלה עצמה, כך שאפשר לשרשר את הקריאות. total מחזירה את סכום המחירים, free_shipping? מחזירה true כשהסכום הוא 20 או יותר, ו-summary מחזירה 3 items, total 12.50 (או 1 item, total 4.00), עם שתי ספרות אחרי הנקודה העשרונית.
הקוד שסופק מוסיף פריט אחד בכל שורת קלט (name price) באמצעות שרשור הקריאות, ואז מדפיס את summary ואת free shipping: true או free shipping: false.
יש לכתוב את הקוד שלך בקובץ shopping_cart.rb. הקובץ main.rb מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
require_relative 'shopping_cart'
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input = []
while (line = gets)
input << line.chomp
end
cart = input.reduce(ShoppingCart.new) do |c, line|
name, price = line.split
c.add(name, price.to_f)
end
puts cart.summary
puts "free shipping: #{cart.free_shipping?}"
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מחלקות ואובייקטים
עבודה עם קבציםהגדרת מחלקותמשתני מופעמתודות ו־selfto_s ו־inspectסיכום — כרטיס ספרייה3מתודות ומשתנים של מחלקה
מתודות של מחלקהמשתני מופע של מחלקהקבועיםמתודות ליצירת מופעיםסיכום – קודי קופוןתרגלו בעצמכם: קומפיילר Ruby אונליין