مُعيِّنات مخصّصة
جزء من قسم البرمجة كائنية التوجه في رحلة Ruby على Coddy. الدرس 8 من 57.
الـ setter هو أسلوب ينتهي اسمه بـ =. وكتابته بنفسك بدلًا من استخدام attr_writer يتيح له تنظيف القيمة قبل تخزينها:
class Person
attr_reader :name
def name=(value)
@name = value.strip.capitalize
end
end
ada = Person.new
ada.name = " aDA "
puts "[#{ada.name}]"الناتج:
[Ada]يمكن للمُعيِّن أيضًا رفض قيمة عن طريق رفع خطأ. لا يتم تعيين متغير المثيل إلا عندما تجتاز القيمة الفحص، لذلك يحتفظ الكائن بحالته القديمة:
class Product
attr_reader :price
def initialize(price)
@price = price
end
def price=(value)
raise ArgumentError, "price must be positive, got #{value}" if value <= 0
@price = value
end
end
item = Product.new(10)
begin
item.price = -5
rescue ArgumentError => e
puts e.message
end
puts item.priceالناتج:
price must be positive, got -5
10يعيد تعبير الإسناد دائمًا القيمة الموجودة على جانبه الأيمن، وليس ما تعيده الدالة المعينة أو تخزّنه. اقرأ السمة مرة أخرى لرؤية القيمة المخزنة:
class Thermometer
attr_reader :celsius
def celsius=(value)
@celsius = value.round
end
end
t = Thermometer.new
result = (t.celsius = 21.7)
puts result
puts t.celsiusالمخرجات:
21.7
22يمنح القارئ والمُعيّن المخصّص معًا سمةً يمكن للكود الخارجي قراءتها وتغييرها، ولكن إلى قيم صالحة فقط. أبقِ التحقّق في المُعيّن وحده، حتى يمرّ كل تغيير عبر القاعدة نفسها:
class Volume
attr_reader :level
def level=(value)
raise ArgumentError, "level must be 0-10" unless (0..10).cover?(value)
@level = value
end
endالتحدي
سهلأكمل الصنف Person. تعمل دالة الضبط name= على إزالة المسافات حول القيمة وكتابة الحرف الأول من كل كلمة بحرف كبير ( ada lovelace تصبح Ada Lovelace). ترفع دالة الضبط age= الخطأ ArgumentError مع الرسالة invalid age: 200 عندما يكون العمر خارج النطاق من 0 إلى 150، وإلا فإنها تخزّنه. يمكن قراءة كلتا القيمتين.
يبدأ كائن Person جديد بالاسم Unknown والعمر 0. يقرأ الكود المزوّد الأوامر name text أو age n، ويطبّقها من خلال دوال الضبط، ويطبع الشخص بالشكل Ada Lovelace (36) بعد كل أمر، أو يطبع رسالة الخطأ عندما ترفض إحدى دوال الضبط القيمة.
ضع الكود الخاص بك في person.rb. يحتوي main.rb على كود الإدخال/الإخراج المزوّد، ولا يمكن تعديله.
جرّب بنفسك
require_relative 'person'
# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input = []
while (line = gets)
input << line.chomp
end
person = Person.new
input.each do |line|
command, value = line.split(" ", 2)
begin
command == "name" ? person.name = value : person.age = value.to_i
puts "#{person.name} (#{person.age})"
rescue ArgumentError => e
puts e.message
end
end
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع2المُوَصِّلات و self
القارئات والكاتباتمُعيِّنات مخصّصةself في الأساليبالهوية والمساواةمراجعة - قائمة جهات الاتصال3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت