Τα πρωτόκολλα είναι ένας μηχανισμός για την επίτευξη πολυμορφισμού στην Elixir, όταν θέλεις η συμπεριφορά να ποικίλλει ανάλογα με τον τύπο δεδομένων.
Τα πρωτόκολλα ορίζονται με το defprotocol και περιέχουν μία ή περισσότερες κεφαλίδες συναρτήσεων.
defprotocol Reversible do
def reverse(term)
end
Τα πρωτόκολλα μπορούν να υλοποιηθούν με το defimpl.
defimpl Reversible, for: List do
def reverse(term) do
Enum.reverse(term)
end
end
Ένα πρωτόκολλο μπορεί να υλοποιηθεί για οποιονδήποτε υπάρχοντα τύπο δεδομένων στην Elixir ή για ένα struct.
Όταν καλείται μια συνάρτηση πρωτοκόλλου, η κατάλληλη υλοποίηση επιλέγεται αυτόματα με βάση τον τύπο του πρώτου ορίσματος.
Αναπτύσσεις το δικό σου βιντεοπαιχνίδι ρόλων. Στο παιχνίδι σου υπάρχουν χαρακτήρες και αντικείμενα. Μία από τις πολλές ενέργειες που μπορείς να κάνεις με ένα αντικείμενο είναι να κάνεις έναν χαρακτήρα να το φάει.
Δεν είναι όλα τα αντικείμενα φαγώσιμα, και δεν έχουν όλα τα φαγώσιμα αντικείμενα τα ίδια αποτελέσματα στον χαρακτήρα. Κάποια αντικείμενα, όταν καταναλώνονται, μετατρέπονται σε ένα διαφορετικό αντικείμενο (π.χ. αν φας ένα μήλο, σου μένει το κουκούτσι του μήλου).
Για να επιτρέψεις όλη αυτή την ευελιξία, αποφάσισες να δημιουργήσεις ένα πρωτόκολλο Edible που μερικά από τα αντικείμενα μπορούν να υλοποιήσουν.
Δημιούργησε το πρωτόκολλο RPG.Edible. Το πρωτόκολλο έχει μία συνάρτηση: την eat. Η συνάρτηση eat δέχεται ένα αντικείμενο και έναν χαρακτήρα και επιστρέφει ένα υποπροϊόν και έναν χαρακτήρα.
Υλοποίησε το πρωτόκολλο RPG.Edible για το αντικείμενο RPG.LoafOfBread. Όταν καταναλωθεί, ένα καρβέλι ψωμί δίνει στον χαρακτήρα 5 πόντους υγείας και δεν έχει υποπροϊόν.
RPG.Edible.eat(%RPG.LoafOfBread{}, %RPG.Character{health: 31})
# => {nil, %RPG.Character{health: 36, mana: 0}}
Υλοποίησε το πρωτόκολλο RPG.Edible για το αντικείμενο RPG.ManaPotion. Όταν καταναλωθεί, ένα φίλτρο μάνα δίνει στον χαρακτήρα πόντους μάνα ίσους με τη δύναμη του φίλτρου, και παράγει ένα άδειο μπουκάλι.
RPG.Edible.eat(%RPG.ManaPotion{strength: 13}, %RPG.Character{mana: 50})
# => {%RPG.EmptyBottle{}, %RPG.Character{health: 100, mana: 63}}
Υλοποίησε το πρωτόκολλο RPG.Edible για το αντικείμενο RPG.Poison. Όταν καταναλωθεί, ένα δηλητήριο αφαιρεί όλους τους πόντους υγείας από τον χαρακτήρα, και παράγει ένα άδειο μπουκάλι.
RPG.Edible.eat(%RPG.Poison{}, %RPG.Character{health: 3000})
# => {%RPG.EmptyBottle{}, %RPG.Character{health: 0, mana: 0}}
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elixir με 58 έννοιες168 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.