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