Στη Gleam, μια έκφραση case μπορεί να χρησιμοποιηθεί για να εκτελέσεις κώδικα υπό συνθήκη. Με μια έκφραση case, μια τιμή μπορεί να ελεγχθεί ως προς ένα ή περισσότερα μοτίβα. Ένα παράδειγμα τέτοιου μοτίβου είναι το κυριολεκτικό μοτίβο, το οποίο αντιπαραβάλλει μια τιμή με μια κυριολεκτική τιμή (π.χ. 1 ή "hello").
Οι εκφράσεις case γράφονται με τη λέξη-κλειδί case:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
1 -> "One"
}
}
Αν και αυτό μπορεί να μοιάζει με εντολές switch σε άλλες γλώσσες, η αντιστοίχιση μοτίβων αρχίζει να λάμπει όταν χρησιμοποιείς κι άλλα μοτίβα. Ένα τέτοιο μοτίβο είναι το μοτίβο μεταβλητής, το οποίο σου επιτρέπει να εκχωρήσεις μια τιμή σε μια μεταβλητή. Σε αυτό το παράδειγμα, στη μεταβλητή i θα εκχωρηθεί η τιμή του number αν δεν είναι 0:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i -> "Non zero"
}
}
Σε ορισμένες περιπτώσεις, μπορεί να θέλεις να προσθέσεις μια επιπλέον συνθήκη σε ένα μοτίβο. Αυτό είναι γνωστό ως φρουρός (ρήτρα), ο οποίος μπορεί να προστεθεί με τη λέξη-κλειδί if:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
}
}
Για λόγους απόδοσης, στους φρουρούς επιτρέπονται μόνο βασικοί μαθηματικοί τελεστές και τελεστές Boolean, ενώ άλλες συναρτήσεις δεν μπορούν να χρησιμοποιηθούν σε αυτούς.
Στο παραπάνω παράδειγμα, δεν θα υπάρχει μοτίβο που να ταιριάζει για κάθε πιθανή είσοδο. Ο μεταγλωττιστής θα το εντοπίσει και θα εμφανίσει ένα σφάλμα. Αυτό είναι γνωστό ως εξαντλητικός έλεγχος. Για να λύσεις την προειδοποίηση, πρέπει να χειριστείς όλες τις περιπτώσεις. Γι' αυτό μπορείς να χρησιμοποιήσεις το μοτίβο αγνόησης, το οποίο είναι ένα μοτίβο που ταιριάζει με οποιαδήποτε τιμή:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
Πολλαπλά μοτίβα μπορούν να αντιστοιχιστούν σε μία ρήτρα, χρησιμοποιώντας το | για να ξεχωρίζεις το καθένα από τα υπόλοιπα. Σε μία ρήτρα μπορεί να προστεθεί μόνο ένας φρουρός:
pub fn describe(number: Int) -> String {
let yell = True
case number {
0 -> "Zero"
3 | 5 -> "One of the first odd prime numbers"
2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
Οι εκφράσεις case ελέγχουν μια τιμή ως προς κάθε μοτίβο από πάνω προς τα κάτω, μέχρι να βρουν ένα μοτίβο που ταιριάζει και να εκτελέσουν τη λογική που σχετίζεται με αυτό το μοτίβο. Η σειρά των μοτίβων έχει σημασία!
Σε αυτή την άσκηση, παίζεις ένα παιχνίδι μαντεψιάς αριθμών με έναν φίλο σου. Οι κανόνες είναι απλοί: επιλέγεις κρυφά έναν αριθμό μεταξύ 1 και 100 και ο φίλος σου προσπαθεί να μαντέψει ποιον αριθμό έχεις επιλέξει. Για να βοηθήσεις τον φίλο σου, απαντάς διαφορετικά ανάλογα με το πόσο κοντά ήταν η μαντεψιά στον αριθμό που έχεις επιλέξει (42). Αυτοί είναι οι κανόνες για τις διαφορετικές απαντήσεις:
42: "Correct"41 ή 43: "So close"41: "Too low"43: "Too high"Έχεις τέσσερις εργασίες για να κωδικοποιήσεις τις απαντήσεις στις μαντεψιές.
Υλοποίησε τη συνάρτηση reply ώστε να απαντά σε μια σωστή μαντεψιά:
reply(42)
// -> "Correct"
Τροποποίησε τη συνάρτηση reply ώστε να απαντά σε κοντινές μαντεψιές:
reply(41)
// -> "So close"
Τροποποίησε τη συνάρτηση reply ώστε να απαντά σε πολύ χαμηλές μαντεψιές:
reply(25)
// -> "Too low"
Τροποποίησε τη συνάρτηση reply ώστε να απαντά σε πολύ υψηλές μαντεψιές:
reply(88)
// -> "Too high"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Gleam με 33 έννοιες122 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.