Διαδρομές
/
Elixir
Elixir
/
Ασκήσεις
/
Ψωμί και φίλτρα
Ψωμί και φίλτρα

Ψωμί και φίλτρα

Άσκηση εκμάθησης

Εισαγωγή

Πρωτόκολλα

Τα πρωτόκολλα είναι ένας μηχανισμός για την επίτευξη πολυμορφισμού στην 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 που μερικά από τα αντικείμενα μπορούν να υλοποιήσουν.

1. Όρισε την έννοια του φαγώσιμου

Δημιούργησε το πρωτόκολλο RPG.Edible. Το πρωτόκολλο έχει μία συνάρτηση: την eat. Η συνάρτηση eat δέχεται ένα αντικείμενο και έναν χαρακτήρα και επιστρέφει ένα υποπροϊόν και έναν χαρακτήρα.

2. Κάνε τα καρβέλια ψωμιού φαγώσιμα

Υλοποίησε το πρωτόκολλο RPG.Edible για το αντικείμενο RPG.LoafOfBread. Όταν καταναλωθεί, ένα καρβέλι ψωμί δίνει στον χαρακτήρα 5 πόντους υγείας και δεν έχει υποπροϊόν.

RPG.Edible.eat(%RPG.LoafOfBread{}, %RPG.Character{health: 31})
# => {nil, %RPG.Character{health: 36, mana: 0}}

3. Κάνε τα φίλτρα μάνα φαγώσιμα

Υλοποίησε το πρωτόκολλο RPG.Edible για το αντικείμενο RPG.ManaPotion. Όταν καταναλωθεί, ένα φίλτρο μάνα δίνει στον χαρακτήρα πόντους μάνα ίσους με τη δύναμη του φίλτρου, και παράγει ένα άδειο μπουκάλι.

RPG.Edible.eat(%RPG.ManaPotion{strength: 13}, %RPG.Character{mana: 50})
# => {%RPG.EmptyBottle{}, %RPG.Character{health: 100, mana: 63}}

4. Κάνε τα δηλητήρια φαγώσιμα

Υλοποίησε το πρωτόκολλο RPG.Edible για το αντικείμενο RPG.Poison. Όταν καταναλωθεί, ένα δηλητήριο αφαιρεί όλους τους πόντους υγείας από τον χαρακτήρα, και παράγει ένα άδειο μπουκάλι.

RPG.Edible.eat(%RPG.Poison{}, %RPG.Character{health: 3000})
# => {%RPG.EmptyBottle{}, %RPG.Character{health: 0, mana: 0}}
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Elixir Exercism

Έτοιμος να ξεκινήσεις την άσκηση Ψωμί και φίλτρα;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elixir με 58 έννοιες168 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.