الثوابت
جزء من قسم البرمجة كائنية التوجه في رحلة Ruby على Coddy. الدرس 14 من 57.
يبدأ الثابت بحرف كبير، ووفقًا للعرف يُكتب بأحرف كبيرة. إذا عُرِّف داخل جسم صنف، فيمكن استخدامه باسمه في كل أساليب الصنف. خارج الصنف تكتب ClassName::NAME:
class Account
MIN_BALANCE = -100
def self.allowed?(balance)
balance >= MIN_BALANCE
end
end
puts Account::MIN_BALANCE
puts Account.allowed?(-50)
puts Account.allowed?(-150)الناتج:
-100
true
falseتناسب الثوابت البيانات الثابتة التي يستخدمها الصف بأكمله، مثل الحدود أو جداول البحث. يؤدي استخدام fetch على ثابت من نوع التجزئة إلى رفع KeyError لمفتاح غير معروف بدلًا من إرجاع nil بهدوء:
class Shipping
RATES = { "standard" => 5, "express" => 12 }.freeze
def self.cost(method)
RATES.fetch(method)
end
end
puts Shipping.cost("express")
begin
Shipping.cost("drone")
rescue KeyError => e
puts e.message
endالناتج:
12
key not found: "drone"لا يمكن توجيه اسم ثابت إلى كائن جديد من دون أن يطبع Ruby تحذيرًا، لكن لا يزال من الممكن تغيير الكائن الذي يحتفظ به. تجعل freeze الكائن نفسه للقراءة فقط، لذا يؤدي التغيير إلى رفع FrozenError:
class Palette
COLORS = ["red", "green"].freeze
end
begin
Palette::COLORS << "blue"
rescue FrozenError => e
puts e.message
end
p Palette::COLORS
p Palette::COLORS.frozen?المخرجات:
can't modify frozen Array: ["red", "green"]
["red", "green"]
trueاختر بناءً على كيفية تصرّف القيمة. القيمة التي لا تتغير أبدًا تنتمي إلى ثابت مُجمَّد؛ أما الحالة التي تتغير أثناء تشغيل البرنامج، مثل العداد، فتنتمي إلى متغير مثيل للفئة:
class Ticket
PREFIX = "TK" # ثابت: ثابت
@issued = 0 # يتغير: متغير مثيل الصنف
def self.next_code
@issued += 1
"#{PREFIX}-#{@issued}"
end
endالتحدي
سهلأكمل الصنف Order. يحتوي على الثوابت RATES (تجزئة مجمّدة: تكلفة standard هي 5، وتكلفة express هي 12، وتكلفة pickup هي 0) وFREE_FROM (50). ترفع initialize(total, method) الخطأ ArgumentError مع unknown shipping: drone عندما لا تكون الطريقة مفتاحًا في RATES. تُرجع shipping القيمة 0 للإجماليات التي تبدأ من FREE_FROM فما فوق، وتُرجع السعر خلاف ذلك، بينما تُرجع to_s القيمة 40.00 + 5 express = 45.00.
يطبع الكود المزوَّد free from 50 باستخدام الثابت، ثم يقرأ الطلبات على شكل أسطر total method ويطبع كل طلب أو رسالة الخطأ.
يجب أن تضع كودك في order.rb. يحتوي main.rb على كود الإدخال/الإخراج المزوَّد ولا يمكن تعديله.
جرّب بنفسك
require_relative 'order'
# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input = []
while (line = gets)
input << line.chomp
end
puts "free from #{Order::FREE_FROM}"
input.each do |line|
total, method = line.split
begin
puts Order.new(total.to_f, method)
rescue ArgumentError => e
puts e.message
end
end
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت