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

الثوابت

جزء من قسم البرمجة كائنية التوجه في رحلة 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
challenge icon

التحدي

سهل

أكمل الصنف 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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Ruby عبر الإنترنت