case (συχνά αναφέρεται ως switch σε άλλες γλώσσες) είναι μια μορφή έκφρασης ελέγχου, όπως το if-else.
Το case επιτρέπει να συνδέσεις πολλαπλές εντολές if-else-if σε αλυσίδα, μπορεί να είναι πιο ευανάγνωστο και επιτρέπει ισχυρές κατασκευές.
Ένα case ορίζεται από τη λέξη-κλειδί case, ακολουθούμενη από μια προαιρετική έκφραση.
Έπειτα, για κάθε περίπτωση, χρησιμοποιείται η λέξη-κλειδί when, ακολουθούμενη από μια έκφραση που συγκρίνεται με την έκφραση του case.
Η λέξη-κλειδί when δεν πρέπει να έχει μεγαλύτερη στοίχιση από τη λέξη-κλειδί case.
Μετά τη λέξη-κλειδί when ακολουθεί ο κώδικας που πρέπει να εκτελεστεί αν η έκφραση του case ταιριάζει με την έκφραση του when.
Το case επιτρέπει μια προαιρετική εντολή else, η οποία εκτελείται αν δεν ταιριάζει καμία άλλη περίπτωση.
Η έκφραση του case αξιολογείται και έπειτα συγκρίνεται με κάθε έκφραση when.
Η σύγκριση γίνεται με τον τελεστή υπαγωγής περίπτωσης (===).
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
===)Ο τελεστής υπαγωγής περίπτωσης (===) είναι λίγο διαφορετικός από τον τελεστή ισότητας (==).
Ο τελεστής ελέγχει αν η δεξιά πλευρά είναι μέλος του συνόλου που περιγράφει η αριστερή πλευρά.
Αυτό σημαίνει ότι έχει σημασία πού τοποθετείται κάθε τελεστέος.
Το πώς λειτουργεί αυτό εξαρτάται από τον τύπο της αριστερής πλευράς. Για παράδειγμα, ένα Range θα ελέγξει αν η δεξιά πλευρά βρίσκεται μέσα στο εύρος, ενώ ένα Object θα ελέγξει αν η δεξιά πλευρά είναι στιγμιότυπο του Object.
(1..3) == 1 # => false
(1..3) === 1 # => true
String == "foo" # => false
String === "foo" # => true
Το case επιτρέπει να ταιριάξεις πολλαπλές εκφράσεις σε ένα μόνο case, με κάθε πιθανή τιμή χωρισμένη με κόμμα.
Θα εκτελέσει τον κώδικα αν ταιριάζει οποιαδήποτε από τις εκφράσεις.
Αυτό μπορεί να είναι χρήσιμο για ένα μόνο case με πολλαπλές πιθανές τιμές.
case 1
when 1, 2
puts "One or two"
else
puts "Other"
end
Το case μπορεί επίσης να ελέγξει αν μια τιμή βρίσκεται μέσα σε ένα εύρος.
Αυτό γίνεται βάζοντας ένα εύρος ως έκφραση when.
case var
when 1..3
puts "One to three"
else
puts "Other"
end
Όταν δεν χρειάζεται έκφραση case, μπορείς να την παραλείψεις.
Αυτό έχει ως αποτέλεσμα κάθε έκφραση να αξιολογείται με βάση το αν είναι αληθής ή ψευδής.
Και τις κάνει να συμπεριφέρονται σαν εντολές 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
Η 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 θα ταιριάξει ή όχι.
case 1
when .odd?
puts "Odd"
when .even?
puts "Even"
end
Το case επιτρέπει εξαντλητικές περιπτώσεις, που σημαίνει ότι είναι δυνατό να διασφαλίσεις πως όλες οι πιθανές τιμές αντιμετωπίζονται.
Είναι παρόμοιο με την εντολή when, αλλά με τη λέξη-κλειδί in αντί για when.
Όταν ένα case είναι εξαντλητικό, δεν υποστηρίζει εντολές when ή else.
Τα εξαντλητικά case μπορούν να χρησιμοποιηθούν σε Bools, τύπους Union, Enum και Tuples.
Τα δύο τελευταία θα καλυφθούν σε επόμενες έννοιες.
Τα εξαντλητικά case σημαίνουν ότι όλες οι πιθανότητες πρέπει να αντιμετωπιστούν, αλλιώς θα προκληθεί σφάλμα μεταγλώττισης.
Η αντιμετώπιση τύπων Union ως εξαντλητικό case είναι παρόμοια με ένα μη εξαντλητικό case.
var : (Int32 | String | Bool)
case var
in Int32
puts "Int32"
in String
puts "String"
in Bool
puts "Bool"
end
Τα Bools μπορούν να αντιμετωπιστούν ως εξαντλητικό case χρησιμοποιώντας τις λέξεις-κλειδιά true και false.
var : Bool
case var
in true
puts "True"
in false
puts "False"
end