أساليب الإنشاء
جزء من قسم البرمجة كائنية التوجه في رحلة Ruby على Coddy. الدرس 15 من 57.
إن طريقة المصنع هي طريقة صنف تنشئ مثيلًا وتعيده. وهي تمنح اسمًا لإحدى طرق بناء كائن. داخل طريقة صنف، يعني new self.new:
class Temperature
attr_reader :celsius
def initialize(celsius)
@celsius = celsius
end
def self.from_fahrenheit(f)
new((f - 32) * 5 / 9.0)
end
def self.freezing
new(0)
end
end
puts Temperature.from_fahrenheit(212).celsius
puts Temperature.freezing.celsiusالناتج:
100.0
0تحويل النص إلى كائن هو مهمة شائعة للمصنع. توجد عملية التحليل بجوار الصنف، وتبقى initialize بسيطة:
class Duration
attr_reader :seconds
def initialize(seconds)
@seconds = seconds
end
def self.parse(text)
new(text.split(":").map(&:to_i).reduce(0) { |acc, part| acc * 60 + part })
end
end
puts Duration.parse("1:30").seconds
puts Duration.parse("2:00:05").secondsالناتج:
90
7205يمكن للمصنّع رفض الإدخال غير الصالح. يتيح إرجاع nil للمتصل اختبار النتيجة باستخدام if؛ ويؤدي رفع خطأ إلى إيقاف البرنامج ما لم يتعامل المتصل معه:
class Color
attr_reader :hex
def initialize(hex)
@hex = hex
end
def self.parse(text)
return nil unless text.match?(/\A#[0-9a-f]{6}\z/i)
new(text.downcase)
end
end
["#FF8800", "orange"].each do |text|
color = Color.parse(text)
puts color ? "ok #{color.hex}" : "not a color: #{text}"
endالناتج:
ok #ff8800
not a color: orangeprivate_class_method :new يجعل استدعاء new ممكنًا داخل الصنف فقط، لذلك تصبح الدوال المُنشئة الطريقة الوحيدة لإنشاء كائن:
class Money
attr_reader :cents
def initialize(cents)
@cents = cents
end
private_class_method :new
def self.from_cents(cents)
new(cents)
end
end
puts Money.from_cents(250).cents
begin
Money.new(250)
rescue NoMethodError => e
puts e.message
endالناتج:
250
private method `new' called for class Moneyالتحدي
سهلأكمل الصنف Duration. تخزّن initialize(seconds) عددًا من الثواني. تقرأ الدالة المُنشئة Duration.parse(text) الصيغة m:ss أو h:mm:ss، وتأخذ الدالة المُنشئة Duration.from_minutes(m) عددًا صحيحًا من الدقائق، وتُرجع plus(other) كائن Duration جديدًا يحتوي على المجموع، بينما تُرجع to_s الصيغة h:mm:ss مع تمثيل الدقائق والثواني برقمين.
يقرأ الكود المُزوَّد المدد: الأسطر مثل 45m تمرّ عبر from_minutes، بينما تمرّ بقية الأسطر عبر parse. يطبع كل مدة، ثم يطبع في النهاية total 1:47:10.
ضع الكود الخاص بك في duration.rb. يحتوي main.rb على كود الإدخال/الإخراج المُزوَّد، ولا يمكن تعديله.
جرّب بنفسك
require_relative 'duration'
# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input = []
while (line = gets)
input << line.chomp
end
durations = input.map do |line|
line.end_with?("m") ? Duration.from_minutes(line.to_i) : Duration.parse(line)
end
durations.each { |d| puts d }
puts "total #{durations.reduce(Duration.new(0)) { |sum, d| sum.plus(d) }}"
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت