Η Elixir διευκολύνει την εφαρμογή της Αρχής Ανοικτού-Κλειστού, επιτρέποντας στις συναρτήσεις να έχουν πολλαπλές ρήτρες: έτσι, αντί για εκτεταμένη και καρφωτή λογική ελέγχου, μπορείς να γράψεις στοχευμένες συναρτήσεις που προσθέτουν ή αφαιρούν συμπεριφορά εύκολα.
Η Elixir προσφέρει πολλαπλές ρήτρες συνάρτησης και φρουρούς για να γράψεις:
def number(n) when n == 7 do
"Awesome, that's my favorite"
end
def number(_n) do
"That's not my favorite"
end
Κατά την εκτέλεση, η Elixir ελέγχει, από την αρχή προς το τέλος του αρχείου πηγαίου κώδικα, ποια ρήτρα συνάρτησης θα καλέσει.
Οι μεταβλητές που δεν χρησιμοποιούνται πρέπει να ξεκινούν με κάτω παύλα.
Οι φρουροί χρησιμοποιούνται για να αποτρέψουν την Elixir από το να καλέσει συναρτήσεις, με βάση την αξιολόγηση των ορισμάτων από συναρτήσεις-φρουρούς. Οι φρουροί ξεκινούν με τη λέξη-κλειδί when, την οποία ακολουθεί μια έκφραση boolean. Οι συναρτήσεις-φρουροί είναι ειδικές συναρτήσεις που:
true ή false.Μια λίστα με τους συνηθισμένους φρουρούς θα βρεις στην τεκμηρίωση της Elixir. Περιλαμβάνει ελέγχους τύπων, βασική αριθμητική, συγκρίσεις και τελεστές που είναι αυστηρά boolean.
Οι συναρτήσεις μπορούν να δηλώνουν προεπιλεγμένες τιμές για ένα ή περισσότερα ορίσματα. Ας δούμε αυτή τη συνάρτηση:
def number(n \\ 13), do: "That's not my favorite"
Όταν γίνεται μεταγλώττιση, η Elixir δημιουργεί έναν ορισμό συνάρτησης για το number/0 (χωρίς ορίσματα) και για το number/1 (ένα όρισμα).
Αν περισσότερα από ένα ορίσματα έχουν προεπιλεγμένες τιμές, οι προεπιλεγμένες τιμές εφαρμόζονται στη συνάρτηση από αριστερά προς τα δεξιά, για να καλύψουν τα ορίσματα που λείπουν.
Αν η συνάρτηση έχει περισσότερες από μία ρήτρες, τα προεπιλεγμένα ορίσματα πρέπει να ορίζονται σε μια κεφαλίδα συνάρτησης (μια συνάρτηση χωρίς σώμα), πριν από τις ρήτρες της συνάρτησης:
def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."
Δημιουργείς ένα απλό διαδικτυακό παιχνίδι όπου ένας φίλος μπορεί να μαντέψει έναν μυστικό αριθμό. Θέλεις να δώσεις κάποια ανατροφοδότηση, αλλά χωρίς να αποκαλύψεις την απάντηση με μια μαντεψιά. Πρέπει να σχεδιάσεις μια συνάρτηση που να δίνει διαφορετικές απαντήσεις ανάλογα με το πώς σχετίζεται η μαντεψιά με τον μυστικό αριθμό.
| Συνθήκη | Απάντηση |
|---|---|
| Όταν η μαντεψιά ταιριάζει με τον μυστικό αριθμό | "Correct" |
| Όταν η μαντεψιά είναι κατά ένα μεγαλύτερη ή κατά ένα μικρότερη από τον μυστικό αριθμό | "So close" |
| Όταν η μαντεψιά είναι μεγαλύτερη από τον μυστικό αριθμό | "Too high" |
| Όταν η μαντεψιά είναι μικρότερη από τον μυστικό αριθμό | "Too low" |
| Όταν δεν γίνεται καμία μαντεψιά | "Make a guess" |
Όλες οι μαντεψιές και οι μυστικοί αριθμοί είναι ακέραιοι αριθμοί.
Υλοποίησε τη συνάρτηση compare/2, η οποία δέχεται δύο ορίσματα, τα secret_number και guess, που είναι και τα δύο ακέραιοι.
GuessingGame.compare(5, 5)
# => "Correct"
Τροποποίησε τη συνάρτηση compare ώστε να ανταποκρίνεται σε μαντεψιές που είναι μεγαλύτερες από τον μυστικό αριθμό.
GuessingGame.compare(5, 8)
# => "Too high"
Τροποποίησε τη συνάρτηση compare ώστε να ανταποκρίνεται σε μαντεψιές που είναι μικρότερες από τον μυστικό αριθμό.
GuessingGame.compare(5, 2)
# => "Too low"
Τροποποίησε τη συνάρτηση compare ώστε να ανταποκρίνεται σε μαντεψιές που είναι κοντά στον μυστικό αριθμό.
GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"
Τροποποίησε τη συνάρτηση compare ώστε να ανταποκρίνεται στην απουσία μαντεψιάς.
GuessingGame.compare(5)
# => "Make a guess"
GuessingGame.compare(5, :no_guess)
# => "Make a guess"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elixir με 58 έννοιες168 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.