Tracks
/
Elixir
Elixir
/
Übungen
/
Brot und Tränke
Brot und Tränke

Brot und Tränke

Lernübung

Einführung

Protokolle

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.

Anleitung

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.

1. Definiere die Essbarkeit

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.

2. Mach Brote essbar

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}}

3. Mach Manatränke essbar

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}}

4. Mach Gifte essbar

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}}
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Elixir Exercism

Bereit, mit Brot und Tränke zu starten?

Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.