Protokolle sind ein Mechanismus, um in Elixir Polymorphismus zu erreichen, wenn das Verhalten sich je nach Datentyp unterscheiden soll.
Protokolle werden mit defprotocol definiert und enthalten einen oder mehrere Funktionsköpfe.
defprotocol Reversible do
def reverse(term)
end
Protokolle können mit defimpl implementiert werden.
defimpl Reversible, for: List do
def reverse(term) do
Enum.reverse(term)
end
end
Ein Protokoll kann für jeden vorhandenen Elixir-Datentyp oder für ein Struct implementiert werden.
Wenn eine Protokollfunktion aufgerufen wird, wählt Elixir automatisch anhand des Typs des ersten Arguments die passende Implementierung aus.
Du entwickelst dein eigenes Rollenspiel-Videospiel. In deinem Spiel gibt es Charaktere und Gegenstände. Eine der vielen Aktionen, die du mit einem Gegenstand ausführen kannst, besteht darin, einen Charakter ihn essen zu lassen.
Nicht alle Gegenstände sind essbar, und nicht alle essbaren Gegenstände haben dieselbe Wirkung auf den Charakter. Manche Gegenstände verwandeln sich beim Essen in einen anderen Gegenstand (z. B. wenn du einen Apfel isst, bleibt ein Apfelgehäuse übrig).
Um diese ganze Flexibilität zu ermöglichen, hast du beschlossen, ein Edible-Protokoll zu erstellen, das einige der Gegenstände implementieren können.
Erstelle das RPG.Edible-Protokoll. Das Protokoll hat eine Funktion: eat. Die eat-Funktion nimmt einen Gegenstand und einen Charakter entgegen und gibt ein Nebenprodukt und einen Charakter zurück.
Implementiere das RPG.Edible-Protokoll für den Gegenstand RPG.LoafOfBread. Wenn ein Brot gegessen wird, gibt es dem Charakter 5 Gesundheitspunkte und hat kein Nebenprodukt.
RPG.Edible.eat(%RPG.LoafOfBread{}, %RPG.Character{health: 31})
# => {nil, %RPG.Character{health: 36, mana: 0}}
Implementiere das RPG.Edible-Protokoll für den Gegenstand RPG.ManaPotion. Wenn ein Manatrank gegessen wird, gibt er dem Charakter so viele Manapunkte wie die Stärke des Tranks und erzeugt eine leere Flasche.
RPG.Edible.eat(%RPG.ManaPotion{strength: 13}, %RPG.Character{mana: 50})
# => {%RPG.EmptyBottle{}, %RPG.Character{health: 100, mana: 63}}
Implementiere das RPG.Edible-Protokoll für den Gegenstand RPG.Poison. Wenn ein Gift gegessen wird, nimmt es dem Charakter alle Gesundheitspunkte und erzeugt eine leere Flasche.
RPG.Edible.eat(%RPG.Poison{}, %RPG.Character{health: 3000})
# => {%RPG.EmptyBottle{}, %RPG.Character{health: 0, mana: 0}}
Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.