المسارات
/
Ruby
Ruby
/
التمارين
/
آلة حاسبة بسيطة
آلة حاسبة بسيطة

آلة حاسبة بسيطة

تمرين تعلّمي

مقدمة

توفّر الاستثناءات في Ruby، كما في لغات كثيرة، وسيلة للتعامل مع الأحداث غير المتوقعة. والتعامل السليم مع الاستثناءات مهم عندما تحاول منع برنامجك من الانهيار.

عندما يُطرح استثناء، سواء بطرحه صراحةً أو بطرح مفسّر Ruby له، يُحوّل البرنامج مسار تشغيله الطبيعي وينتهي في النهاية برسالة خطأ:

raise ArgumentError.new("Something went wrong!")
=> Traceback (most recent call last):
.
.
ArgumentError (Something went wrong!)
1/0
=> Traceback (most recent call last):
.
.
ZeroDivisionError (divided by 0)

وإذا أردنا إيقاف عملية الإنهاء هذه، فعلينا أن نتفاعل مع الاستثناء. وهذا ما يسمى «إنقاذ» الاستثناء:

begin
  # ...any code that raises an exception
rescue
  puts 'Got an exception'
end

لن ينهار هذا البرنامج، وسيطبع "Got an exception". فبدلًا من الخروج، ينفّذ Ruby الكود الموجود في كتلة rescue، وهي تطبع رسالة.

وكما هو الحال في كل شيء في Ruby، فإن الاستثناءات أيضًا كائنات، وعادةً ما تحمل بيانات عن الاستثناء. وهكذا يمكننا الحصول على كائن الاستثناء:

begin
  # ...any code that raises an exception
rescue => e
  puts "Exception class: #{ e.class.name }"
  puts "Exception Message:#{e.message}"
end

في Ruby يمكنك أيضًا طرح استثناءاتك الخاصة. على سبيل المثال:

begin
  raise ArgumentError.new("Invalid argument")
rescue ArgumentError => e
  puts e.message
end

الاستثناء السابق هو أحد الاستثناءات المدمجة في Ruby، لكن يمكنك أيضًا تعريف استثناءات مخصصة وطرحها:

class CustomError < StandardError
end

raise CustomError.new("Something went wrong")

التعليمات

في هذا التمرين ستبني معالجة الأخطاء لآلة حاسبة بسيطة.

الهدف هو الحصول على آلة حاسبة تعمل وتُرجع سلسلة نصية بالصيغة التالية: 16 + 51 = 67، عند تمرير الوسائط 16 و51 و+.

SimpleCalculator.calculate(16, 51, "+")
# => "16 + 51 = 67"
SimpleCalculator.calculate(32, 6, "*")
# => "32 * 6 = 192"
SimpleCalculator.calculate(512, 4, "/")
# => "512 / 4 = 128"

1. تعامل مع الكود الذي قد يرفع أخطاءً داخل الطريقة calculate

الطريقة الرئيسية للتنفيذ في هذه المهمة هي طريقة الصنف SimpleCalculator.calculate(). وهي تأخذ ثلاثة وسائط. الوسيطان الأولان عددان ستُجرى عليهما العملية. الوسيط الثالث من النوع سلسلة نصية، ومن الضروري في هذا التمرين تنفيذ العمليات التالية:

  • الجمع باستخدام السلسلة النصية +
  • الضرب باستخدام السلسلة النصية *
  • القسمة باستخدام السلسلة النصية /

2. تعامل مع العمليات غير المسموح بها

حدّث الطريقة SimpleCalculator.calculate() لترفع استثناء UnsupportedOperation عند رموز العمليات غير المعروفة.

SimpleCalculator.calculate(1, 2, '-')
# => Raises an UnsupportedOperation
Note

في هذا التمرين، يُتوقع منك تعريف استثناء UnsupportedOperation لنطاق محدد.

3. تعامل مع الوسائط غير الصالحة

حدّث الطريقة SimpleCalculator.calculate() لترفع استثناء ArgumentError عند أنواع الوسائط غير الصالحة.

SimpleCalculator.calculate(1, '2', '*')
# => Raises an ArgumentError

4. تعامل مع استثناءات القسمة على صفر

حدّث الطريقة SimpleCalculator.calculate() لتتعامل مع استثناءات ZeroDivisionError. يجب أن يُرجع كود المعالجة سلسلة نصية تحتوي على Division by zero is not allowed.. ولا ينبغي للطريقة SimpleCalculator.calculate() أن تتعامل مع أي استثناء آخر.

SimpleCalculator.calculate(512, 0, "/")
# => returns "Division by zero is not allowed."
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Ruby Exercism

مستعد لبدء آلة حاسبة بسيطة؟

سجّل في Exercism لتتعلّم وتتقن Ruby عبر 21 مفهومًا121 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.