Case (يُشار إليه غالبًا باسم switch في لغات أخرى) هو أحد أشكال تعبيرات التحكم مثل if-else. تتيح جملة case ربط عدة عبارات if-else-if معًا، ويمكن أن تكون أكثر وضوحًا في القراءة مع أنها توفّر التحكم في مسار التنفيذ.
تُعرَّف جملة case بالكلمة المفتاحية case متبوعةً بتعبير اختياري. ثم تُستخدم الكلمة المفتاحية when لكل حالة، متبوعةً بتعبير يُقارَن بتعبير case. ولا ينبغي إزاحة الكلمة المفتاحية when عن الكلمة المفتاحية case. وبعد الكلمة المفتاحية when يأتي الكود الذي يجب تنفيذه إذا طابق تعبير case تعبير when. وتتيح جملة case عبارة else اختيارية تُنفَّذ إذا لم تطابق أي حالة أخرى.
يُقيَّم تعبير case ثم يُقارَن بكل تعبير when. وتُجرى المقارنة باستخدام عامل تساوي case (===).
value = 1
case value
when 1
"One"
when 2
"Two"
else
"Other"
end
# This is the same as:
value = 1
if 1 === value
"One"
elsif 2 === value
"Two"
else
"Other"
end
case (===)يختلف عامل تساوي case (===) قليلًا عن عامل المساواة (==). يتحقق هذا العامل مما إذا كان الطرف الأيمن عضوًا في المجموعة التي يصفها الطرف الأيسر. وهذا يعني أن موضع كل طرف مهم. وتتوقف كيفية عمل ذلك على نوع الطرف الأيسر، فمثلًا يتحقق Range مما إذا كان الطرف الأيمن ضمن المدى، ويتحقق Object مما إذا كان الطرف الأيمن نسخةً من Object.
(1..3) == 1 # => false
(1..3) === 1 # => true
String == "foo" # => false
String === "foo" # => true
case مع تعبيرات متعددةتتيح جملة case مطابقة عدة تعبيرات في حالة واحدة، مع فصل كل قيمة ممكنة بفاصلة. وسيُنفَّذ الكود إذا طابق أي من التعبيرات. وقد يكون ذلك مفيدًا عندما تريد أن تكون لحالة واحدة عدة قيم ممكنة.
case var
when 1, 2
"One or two"
else
"Other"
end
case مع المدىيمكن لجملة case أيضًا التحقق مما إذا كانت قيمة ما ضمن مدى. ويتم ذلك بوضع مدى كتعبير when.
case var
when 1..3
puts "One to three"
else
puts "Other"
end
case بدون تعبيرعندما لا تكون هناك حاجة إلى تعبير case، يمكن حذفه. سيؤدي ذلك إلى تقييم كل تعبير when من حيث كونه صحيحًا أو خطأً، فتصبح جملة case أشبه بعبارات if-else-if.
case
when 1 == 1
"One is equal to one"
when 1 > 2
"One is greater than two"
else
"Other"
end
when في سطر واحدتتيح Ruby كتابة جمل case في سطر واحد. ويمكن استخدام ذلك عندما تكون لديك عبارة بسيطة في سطر واحد. وتُكتب عبارة when في سطر واحد بالصيغة when <expression> then <statement>. وعند استخدامها في عبارة else تُكتب بالصيغة else <statement>.
case var
when 1 then "One"
when 2 then "Two"
else "Other"
end
case مع الأنواعتتيح جملة case المطابقة مع الأنواع. وهذا مفيد عندما تريد سلوكًا مختلفًا حسب نوع المتغير.
case var
when Integer
"Integer"
when String
"String"
else
"Other"
end
في هذا التمرين سنحاكي الجولة الأولى من لعبة البلاك جاك.
ستتلقى بطاقتين وستتمكن من رؤية البطاقة المكشوفة للموزّع. تُمثَّل جميع البطاقات بسلسلة نصية مثل "ace" و"king" و"three" و"two" وهكذا. وقيم كل بطاقة هي:
| البطاقة | القيمة | البطاقة | القيمة |
|---|---|---|---|
| ace | 11 | eight | 8 |
| two | 2 | nine | 9 |
| three | 3 | ten | 10 |
| four | 4 | jack | 10 |
| five | 5 | queen | 10 |
| six | 6 | king | 10 |
| seven | 7 | other | 0 |
عادةً، يمكن أن تأخذ بطاقات الآس القيمة 1 أو 11، ولكن للتبسيط سنفترض أنها لا يمكن أن تأخذ سوى القيمة 11.
نفّذ الطريقة Blackjack.parse_card التي تأخذ بطاقة في صورة سلسلة نصية كوسيط.
وينبغي أن تُرجع الطريقة قيمة البطاقة كعدد صحيح.
Blackjack.parse_card("ace")
# => 11
ينبغي تصنيف نقاط اللاعب إلى مجالات من القيم. وتُحسب نقاط اللاعب بجمع قيم بطاقتي اللاعب. والمجالات المستخدمة هي:
| المجال | القيمة |
|---|---|
| low | [4, 11] |
| mid | [12, 16] |
| high | [17, 20] |
| blackjack | [21] |
نفّذ الطريقة Blackjack.card_range التي تأخذ بطاقتين في صورة سلسلة نصية كوسيطين.
وينبغي أن تُرجع الطريقة اسم مجال القيم الذي تقع فيه البطاقتان.
Blackjack.card_range("ten", "king")
# => "high"
بناءً على بطاقتيك وبطاقة الموزّع، هناك استراتيجية للجولة الأولى من اللعبة، لديك فيها الخيارات التالية:
على الرغم من أنها ليست مثالية بعد، ستتبع الاستراتيجية التي كان صديقك Alex يطورها، وهي كالتالي:
نفّذ الطريقة Blackjack.first_turn التي تأخذ ثلاث بطاقات في صورة سلاسل نصية كوسائط.
وينبغي أن تُرجع الطريقة القرار الذي ينبغي أن تتخذه في صورة سلسلة نصية.
Blackjack.first_turn("ace", "ace", "two")
# => "P"
سجّل في Exercism لتتعلّم وتتقن Ruby عبر 21 مفهومًا121 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.