الأساليب و 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مراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت