Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الأساليب و 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
challenge icon

التحدي

سهل

أكمل الصنف 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?}"
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Ruby عبر الإنترنت