جم

جملة `case` في Crystal

1 تمرين

نبذة عن جملة `case`

case (وتُسمى غالبًا switch في لغات أخرى) هي أحد أشكال تعبيرات التحكم مثل if-else. تتيح case ربط عدة جمل if-else-if معًا، وقد تكون أكثر قابلية للقراءة، وتفتح المجال أمام بنى قوية.

يتكوّن تعبير case من الكلمة المفتاحية case متبوعةً بتعبير اختياري. ثم تُستخدم الكلمة المفتاحية when لكل حالة، متبوعةً بتعبير يُقارَن بتعبير case. ويجب ألا تكون الكلمة المفتاحية when مُزاحةً بمسافة بادئة عن الكلمة المفتاحية case. ويأتي بعد الكلمة المفتاحية when الكود الذي يجب تنفيذه إذا طابق تعبيرُ case تعبيرَ when. وتتيح case عبارة else اختيارية تُنفَّذ إذا لم تطابق أي حالة أخرى.

يُقيَّم تعبير case ثم يُقارَن بكل تعبير when. وتُجرى المقارنة باستخدام عامل احتواء case (===).

case 1
when 1
  puts "One"
when 2
  puts "Two"
else
  puts "Other"
end
# => One

# This is the same as:
tmp = 1
if 1 === tmp
  puts "One"
elsif 2 === tmp
  puts "Two"
else
  puts "Other"
end

عامل احتواء case (===)

يختلف عامل احتواء case (===) قليلًا عن عامل المساواة (==). يتحقق العامل مما إذا كان الطرف الأيمن عضوًا في المجموعة التي يصفها الطرف الأيسر. وهذا يعني أن موضع كل طرف مهم. وتعتمد طريقة عمل ذلك على نوع الطرف الأيسر؛ فمثلًا يتحقق Range مما إذا كان الطرف الأيمن داخل النطاق، ويتحقق Object مما إذا كان الطرف الأيمن نسخةً من Object.

(1..3) == 1  # => false
(1..3) === 1 # => true

String == "foo"  # => false
String === "foo" # => true

الحالات ذات التعبيرات المتعددة

تتيح الحالات مطابقة عدة تعبيرات في حالة واحدة، مع فصل كل قيمة ممكنة بفاصلة. وتنفّذ الحالة الكود إذا طابق أيٌّ من التعبيرات. وقد يكون ذلك مفيدًا لحالة واحدة لها عدة قيم ممكنة.

case 1
when 1, 2
  puts "One or two"
else
  puts "Other"
end

الحالات مع النطاقات

يمكن للحالات أيضًا التحقق مما إذا كانت قيمة داخل نطاق. ويتم ذلك بأن يكون تعبير when نطاقًا.

case var
when 1..3
  puts "One to three"
else
  puts "Other"
end

حالات بلا تعبير case

عندما لا تكون هناك حاجة إلى تعبير case، يمكن حذفه. وبذلك يُقيَّم كل تعبير من تعبيرات when من حيث كونه صحيحًا أو خطأً. وتجعلها تتصرّف مثل الجمل الشرطية if-else-if.

case
when 1 == 1
  puts "One is equal to one"
when 1 > 2
  puts "One is greater than two"
else
  puts "Other"
end

when في سطر واحد

تتيح Crystal كتابة جمل case في سطر واحد. ويمكن استخدام ذلك عندما تكون لديك عبارة بسيطة في سطر واحد. وتُكتب عبارة when ذات السطر الواحد بالشكل when <expression> then <statement>.. وعند استخدامها في عبارة else، تُكتب بالشكل else <statement>.

case var
when 1 then puts "One"
when 2 then puts "Two"
else puts "Other"
end

الحالات مع الأنواع

تتيح case المطابقة مع الأنواع. وتستخدم المقارنة العامل is_a? للتحقق من نوع المتغير. فمثلًا، يتيح ذلك فرعًا واحدًا لكل نوع في نوع اتحادي.

case var
when Int32
  puts "Int32"
when String
  puts "String"
else
  puts "Other"
end

الكائن الضمني

تتيح case استخدام كائن ضمني. ويتيح ذلك، على سبيل المثال، أن يكون تعبير when استدعاءً لطريقة على تعبير case. فبحسب ما إذا كانت الطريقة تُرجع قيمة تُعتبر صحيحة أم خاطئة، تُطابَق الحالة أو لا تُطابَق.

case 1
when .odd?
  puts "Odd"
when .even?
  puts "Even"
end

الحالات الشاملة

تتيح case الحالات الشاملة، أي أنه يمكن التأكد من معالجة كل القيم الممكنة. وهي تشبه عبارة when، لكن مع الكلمة المفتاحية in بدلًا من when. وعندما تكون الحالة شاملة، فإنها لا تدعم أي عبارة when أو else.

ويمكن استخدام الحالات الشاملة مع Bools وأنواع Union وEnum وTuples. وسيُغطّى الأخيران في مفاهيم لاحقة.

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

var : (Int32 | String | Bool)
case var 
in Int32
  puts "Int32"
in String
  puts "String"
in Bool
  puts "Bool"
end

ويمكن معالجة Bools كحالة شاملة باستخدام الكلمتين المفتاحيتين true وfalse.

var : Bool
case var
in true
  puts "True"
in false
  puts "False"
end
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم جملة `case`

التدريب مقفل

افتح 6 تمارين إضافية لممارسة جملة `case`