A protokollok olyan mechanizmus, amellyel polimorfizmust érhetsz el Elixirben, amikor azt szeretnéd, hogy a viselkedés az adattípustól függően változzon.
A protokollokat a defprotocol kulcsszóval definiálod, és egy vagy több függvényfejlécet tartalmaznak.
defprotocol Reversible do
def reverse(term)
end
A protokollokat a defimpl kulcsszóval implementálhatod.
defimpl Reversible, for: List do
def reverse(term) do
Enum.reverse(term)
end
end
Egy protokollt implementálhatsz bármely létező Elixir-adattípusra, de egy structra is.
Amikor meghívunk egy protokollfüggvényt, az első argumentum típusa alapján automatikusan kiválasztódik a megfelelő implementáció.
A saját szerepjátékodat fejleszted. A játékodban karakterek és tárgyak vannak. A tárggyal sokféle műveletet végezhetsz, és ezek egyike, hogy megetetsz vele egy karaktert.
Nem minden tárgy ehető, és nem minden ehető tárgy hat ugyanúgy a karakterre. Némelyik tárgy megevés után más tárggyá alakul (például ha megeszel egy almát, marad utána egy almacsutka).
Hogy mindez ilyen rugalmas lehessen, úgy döntöttél, hogy létrehozol egy Edible protokollt, amelyet a tárgyak egy része megvalósíthat.
Hozd létre az RPG.Edible protokollt. A protokollnak egyetlen függvénye van: az eat. Az eat függvény kap egy tárgyat és egy karaktert, és visszaad egy mellékterméket meg egy karaktert.
Valósítsd meg az RPG.Edible protokollt az RPG.LoafOfBread tárgyhoz. Megevéskor a kenyér 5 életpontot ad a karakternek, és nincs mellékterméke.
RPG.Edible.eat(%RPG.LoafOfBread{}, %RPG.Character{health: 31})
# => {nil, %RPG.Character{health: 36, mana: 0}}
Valósítsd meg az RPG.Edible protokollt az RPG.ManaPotion tárgyhoz. Megevéskor a manaital annyi manapontot ad a karakternek, amennyi az ital ereje, és egy üres üveget hoz létre.
RPG.Edible.eat(%RPG.ManaPotion{strength: 13}, %RPG.Character{mana: 50})
# => {%RPG.EmptyBottle{}, %RPG.Character{health: 100, mana: 63}}
Valósítsd meg az RPG.Edible protokollt az RPG.Poison tárgyhoz. Megevéskor a méreg elveszi a karakter összes életpontját, és egy üres üveget hoz létre.
RPG.Edible.eat(%RPG.Poison{}, %RPG.Character{health: 3000})
# => {%RPG.EmptyBottle{}, %RPG.Character{health: 0, mana: 0}}
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Elixir nyelvet 58 fogalom168 feladat segítségével, valódi emberi mentorálással, mindez ingyen.