Στην Elixir, η πλειάδα είναι μια δομή δεδομένων που οργανώνει δεδομένα, κρατώντας έναν σταθερό αριθμό στοιχείων οποιουδήποτε τύπου, αλλά χωρίς ρητά ονόματα για κάθε στοιχείο. Οι πλειάδες χρησιμοποιούνται συχνά στην Elixir για λειτουργίες με εντατική ανάγνωση μνήμης, καθώς η ανάγνωση ενός στοιχείου είναι λειτουργία σταθερού χρόνου. Συνήθως δεν χρησιμοποιούνται όταν στοιχεία μπορεί να χρειαστεί να προστεθούν ή να αφαιρεθούν δυναμικά, γιατί αντί να τροποποιηθεί η υπάρχουσα πλειάδα, δημιουργείται μια νέα πλειάδα, η οποία απαιτεί να δεσμευτεί μνήμη εκ των προτέρων.
Στην πράξη, οι πλειάδες δημιουργούνται στην Elixir χρησιμοποιώντας άγκιστρα. Τα στοιχεία μιας πλειάδας μπορούν να προσπελαστούν μεμονωμένα με τη συνάρτηση elem/2, όπου οι θέσεις ξεκινούν από το 0:
empty_tuple = {}
one_element_tuple = {1}
multiple_element_tuple = {1, :a, "hello"}
elem(multiple_element_tuple, 2)
# => "hello"
Στην πράξη, οι πλειάδες χρησιμοποιούνται συχνά για να αναπαραστήσουν ομαδοποιημένη πληροφορία.
Float.ratio(0.25)
# => {1, 4} indicating the numerator and denominator of the fraction ¼
Η χρήση της αντιστοίχισης προτύπων κυριαρχεί στον ιδιωματικό κώδικα Elixir, ο οποίος βασίζεται σε βεβαιώσεις. Ίσως θυμάσαι ότι το =/2 περιγράφεται ως τελεστής αντιστοίχισης και όχι ως τελεστής ανάθεσης. Όταν χρησιμοποιείς τον τελεστή αντιστοίχισης, αν το πρότυπο στα αριστερά ταιριάζει με τα δεξιά, τυχόν μεταβλητές στα αριστερά δεσμεύονται και επιστρέφεται η τιμή της δεξιάς πλευράς. Αν δεν υπάρξει αντιστοίχιση, πετάγεται ένα MatchError.
2 = 2
# => 2
# Literals can be matched if they are the same
2 = 3
# => ** (MatchError) no match of right hand side value: 3
{_, denominator} = Float.ratio(0.25)
# => {1, 4}
# the variable `denominator` is bound to the value 4
Θυμήσου: οι αντιστοιχίσεις γίνονται από τη δεξιά πλευρά προς την αριστερή.
Στο τελευταίο παράδειγμα, αν δεν χρειάζεσαι κάποια μεταβλητή σε μια αντιστοίχιση προτύπου, μπορείς να την αγνοήσεις αναφέροντας το _. Κάθε μεταβλητή που ξεκινά με _ δεν παρακολουθείται από το runtime.
Η αντιστοίχιση προτύπων είναι επίσης ένα χρήσιμο εργαλείο όταν δημιουργείς πολλαπλές ρήτρες συνάρτησης. Η αντιστοίχιση προτύπων μπορεί να χρησιμοποιηθεί στα ορίσματα των συναρτήσεων, κάτι που καθορίζει ποια ρήτρα συνάρτησης θα κληθεί, ξεκινώντας από την αρχή του αρχείου και προχωρώντας προς τα κάτω μέχρι την πρώτη αντιστοίχιση. Οι μεταβλητές μπορούν να δεσμευτούν στην κεφαλή της συνάρτησης και να χρησιμοποιηθούν στο σώμα της.
defmodule Example do
def named_function(:a = variable_a) do
{variable_a, 1}
end
def named_function(:b = variable_b) do
{variable_b, 2}
end
end
Example.named_function(:a)
# => {:a, 1}
Example.named_function(:b)
# => {:b, 2}
Example.named_function(:c)
# => ** (FunctionClauseError) no function clause matching in Example.named_function/1
Ενώ ετοιμάζεσαι να ψήσεις μπισκότα για τους φίλους σου, ανακάλυψες ότι πρέπει να μετατρέψεις κάποιες από τις μονάδες μέτρησης που χρησιμοποιεί η συνταγή. Γνωρίζοντας μόνο το μετρικό σύστημα, πρέπει να βρεις έναν τρόπο να μετατρέπεις τις συνηθισμένες αμερικανικές μονάδες μέτρησης για ψήσιμο σε χιλιοστόλιτρα (mL) για ευκολία σου.
Χρησιμοποίησε αυτόν τον πίνακα μετατροπών για τη λύση σου:
| Μονάδα προς μετατροπή | όγκος | σε χιλιοστόλιτρα (mL) |
|---|---|---|
| mL | 1 | 1 |
| αμερικανική κούπα | 1 | 240 |
| αμερικανική υγρή ουγγιά | 1 | 30 |
| αμερικανικό κουταλάκι του γλυκού | 1 | 5 |
| αμερικανική κουταλιά της σούπας | 1 | 15 |
Καθώς είσαι ένας ταλαντούχος εκπαιδευόμενος προγραμματιστής, αποφασίζεις να χρησιμοποιήσεις τα χιλιοστόλιτρα ως ενδιάμεση μονάδα για να διευκολύνεις τη μετατροπή από οποιαδήποτε μονάδα του πίνακα σε οποιαδήποτε άλλη (ακόμα και στην ίδια).
Υλοποίησε τη συνάρτηση KitchenCalculator.get_volume/1. Δεδομένης μιας πλειάδας ζεύγους όγκου, θα πρέπει να επιστρέφει μόνο το αριθμητικό μέρος.
KitchenCalculator.get_volume({:cup, 2.0})
# => 2.0
Υλοποίησε τη συνάρτηση KitchenCalculator.to_milliliter/1. Δεδομένης μιας πλειάδας ζεύγους όγκου, θα πρέπει να μετατρέπει τον όγκο σε χιλιοστόλιτρα χρησιμοποιώντας τον πίνακα μετατροπών.
Χρησιμοποίησε πολλαπλές ρήτρες συνάρτησης και αντιστοίχιση προτύπων για να δημιουργήσεις τις συναρτήσεις για κάθε μονάδα. Τα άτομα που χρησιμοποιούνται για να δηλώσουν κάθε μονάδα είναι: :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter. Επίστρεψε το αποτέλεσμα της μετατροπής τυλιγμένο σε μια πλειάδα.
KitchenCalculator.to_milliliter({:cup, 2.5})
# => {:milliliter, 600.0}
Υλοποίησε τη συνάρτηση KitchenCalculator.from_milliliter/2. Δεδομένης μιας πλειάδας ζεύγους όγκου και της επιθυμητής μονάδας, θα πρέπει να μετατρέπει τον όγκο στην επιθυμητή μονάδα χρησιμοποιώντας τον πίνακα μετατροπών.
Χρησιμοποίησε πολλαπλές ρήτρες συνάρτησης και αντιστοίχιση προτύπων για να δημιουργήσεις τις συναρτήσεις για κάθε μονάδα. Τα άτομα που χρησιμοποιούνται για να δηλώσουν κάθε μονάδα είναι: :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter
KitchenCalculator.from_milliliter({:milliliter, 1320.0}, :cup)
# => {:cup, 5.5}
Υλοποίησε τη συνάρτηση KitchenCalculator.convert/2. Δεδομένης μιας πλειάδας ζεύγους όγκου και της επιθυμητής μονάδας, θα πρέπει να μετατρέπει τον δεδομένο όγκο στην επιθυμητή μονάδα.
KitchenCalculator.convert({:teaspoon, 9.0}, :tablespoon)
# => {:tablespoon, 3.0}
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elixir με 58 έννοιες168 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.