Διαδρομές
/
Crystal
Crystal
/
Ύλη
/
Περίπτωση
Πε

Περίπτωση σε Crystal

1 άσκηση

Σχετικά με την έννοια Περίπτωση

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 με πολλαπλές πιθανές τιμές.

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

Case με εύρη

Το case μπορεί επίσης να ελέγξει αν μια τιμή βρίσκεται μέσα σε ένα εύρος. Αυτό γίνεται βάζοντας ένα εύρος ως έκφραση when.

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

Case χωρίς έκφραση case

Όταν δεν χρειάζεται έκφραση 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

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 με τύπους

Το 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

Το 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
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Περίπτωση

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 6 ακόμη ασκήσεις για να εξασκηθείς στην έννοια Περίπτωση