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

أساليب الأصناف

جزء من قسم البرمجة كائنية التوجه في رحلة 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)، مع منزلة عشرية واحدة والحالة المحسوسة لقيمة Celsius؛ ويستخدم أساليب الصنف الأخرى.

يستدعي الكود المزوّد 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 عبر الإنترنت