أساليب الأصناف
جزء من قسم البرمجة كائنية التوجه في رحلة 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 Circleclass << 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التحدي
سهلأكمل أساليب الصنف 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) }
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت