عشاء القلعة

عشاء القلعة

تمرين تعلّمي

مقدمة

لدى Crystal نوع يسمى Nil، ولا يمكن أن يأخذ إلا قيمة واحدة: nil. وهو يُستخدم للتعبير عن غياب القيمة، ويشبه null أو None في لغات أخرى.

يمكن أن تُرجع دوال وطرق متعددة قيم Nil، ومنها على سبيل المثال String#[]?، التي تُرجع nil إذا كان الفهرس خارج الحدود.

"foo"[10]? # => nil

في Crystal ما يُعرف بـ فحوص المراجع الفارغة، أي أن جميع الأنواع لا تكون nil افتراضيًا. وهذا يعني أنك لا تستطيع إسناد nil إلى متغير ما لم تصرّح صراحةً بأنه من نوع Nil. وهذا بدوره يعني أن المترجم سيتحقق تلقائيًا من المراجع الفارغة.

قيمة غير صحيحة

يمكن اتباع أساليب معينة للتعامل مع قيم nil. قيمة nil قيمة غير صحيحة، وكذلك false. وهذا يعني أنها في العبارات وغيرها من المواضع التي يُتوقع فيها قيمة صحيحة أو غير صحيحة ستُعامَل معاملة false.

if nil
  puts "nil is truthy"
else
  puts "nil is falsey"
end

# => nil is falsey

وهذا يعني أن فرع القيمة الصحيحة لن يُنفَّذ إذا كان المتغير القابل لأن يكون nil يحمل القيمة nil.

foo = "boo"[2]? # It is possible that foo is nil
if foo
  p foo.class # => Char
end

التحقق من nil

لدى Crystal طريقة يمكن استخدامها للتحقق مما إذا كانت قيمة ما هي nil. وهي تُسمى nil? ومتاحة على جميع الكائنات.

foo = "boo"[2]?
if foo.nil?
  puts "foo is nil"
else
  puts "foo is not nil"
end

يختلف الأمر قليلًا عند استخدام القيمة مباشرة في جملة شرطية، ففي الأمثلة السابقة كانت كل من false وnil تُعامَلان على أنها false. أما هنا، فلا تُعامَل على أنها غير صحيحة إلا nil، لأنه لو كانت false لما كانت nil، وبالتالي لكانت قيمة صحيحة.

عامل أو

أسهل أسلوب للتعامل مع قيم nil هو ضمان ألا تصبح nil من الأساس. كثيرًا ما يُستخدم عامل أو (||) عند التعامل مع Bools، لكنه يمكن أن يُستخدم أيضًا للتعامل مع قيم nil إذا فُهم فهمًا صحيحًا. يتحقق عامل أو مما إذا كانت القيمة الأولى صحيحة، وإن لم تكن كذلك تُستخدم القيمة الثانية. ويمكن استخدام ذلك بحيث إذا كانت القيمة nil فإنها تكون غير صحيحة، وبالتالي تُستخدم القيمة الثانية.

"foo"[10]? || "bar" # => "bar"

التعليمات

تحتفل جلالتك بحفل عشاء في كوبنهاغن، عاصمة اتحاد كالمار. إنه أكبر حفل في العام، وجميع النبلاء مدعوون. لكن الشائعات تنتشر في أنحاء البلاد عن مؤامرة لسمّ جلالتك.

طلبت جلالتها منك، أنت كاشف السموم الملكي، أن تعرف ما إذا كان أي طعام أو شراب مسمومًا. تعتزم جلالتك تقديم Mushroom pasties فقط كطعام، أما المشروبات فهناك تشكيلة متنوعة منها.

1. تحقّق من صحة الطعام

هناك احتمال كبير أن يكون الطعام مسمومًا إن لم يكن ما طلبته جلالتها. وإذا لم يكن الطعام ما طلبته جلالتها، فينبغي التخلص منه.

نفّذ الطريقة check_food? التي تأخذ الوسيط food، وهو يحمل اسم الطعام على هيئة String. ينبغي أن تُرجع الطريقة الطعام إذا كان Mushroom pasties، وإلا فتُرجع nil.

CastleDinner.check_food?("Mushroom pasties")
# => "Mushroom pasties"

CastleDinner.check_food?("Bread")
# => nil

2. تحقّق مما إذا كان الشراب مسمومًا

من الممكن أن يكون الشراب مسمومًا، لكن معرفة ذلك أصعب قليلًا. يكون الشراب مسمومًا إذا لم يحتوِ اسمه على حرف i، ولا يهم حالة الأحرف. وينبغي التخلص من الشراب إذا كان مسمومًا.

نفّذ الطريقة check_drink? التي تأخذ الوسيط drink، وهو يحمل اسم الشراب على هيئة String. ينبغي أن تُرجع الطريقة الشراب إذا لم يكن مسمومًا، وإلا فتُرجع nil.

CastleDinner.check_drink?("Apple juice")
# => "Apple juice"

CastleDinner.check_drink?("Tea")
# => nil

3. استبدل الشراب

لا تريد جلالتك أن تُقلق ضيوفها بسبب السم في طعامهم. لذلك، إذا كان الشراب مسمومًا، فينبغي استبداله بشراب جديد، وتحديدًا Apple juice.

نفّذ الطريقة replace_drink التي تأخذ الوسيط drink، وهو يحمل اسم الشراب على هيئة String. ينبغي أن تُرجع الطريقة الشراب إذا لم يكن مسمومًا، وإلا فتُرجع "Apple juice".

CastleDinner.replace_drink("Orange juice")
# => "Orange juice"

CastleDinner.replace_drink("Tea")
# => "Apple juice"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Crystal Exercism

مستعد لبدء عشاء القلعة؟

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