Tracks
/
Elixir
Elixir
/
Ejercicios
/
Pan y pociones
Pan y pociones

Pan y pociones

Ejercicio de aprendizaje

Introducción

Protocolos

Los protocolos son un mecanismo para lograr polimorfismo en Elixir cuando quieres que el comportamiento varíe según el tipo de datos.

Los protocolos se definen con defprotocol y contienen uno o más encabezados de función.

defprotocol Reversible do
  def reverse(term)
end

Los protocolos se pueden implementar con defimpl.

defimpl Reversible, for: List do
  def reverse(term) do
    Enum.reverse(term)
  end
end

Un protocolo se puede implementar para cualquier tipo de datos de Elixir que ya exista o para un struct.

Cuando se invoca una función de un protocolo, la implementación adecuada se elige automáticamente según el tipo del primer argumento.

Instrucciones

Estás desarrollando tu propio videojuego de rol. En tu juego hay personajes y objetos. Una de las muchas acciones que puedes hacer con un objeto es hacer que un personaje se lo coma.

No todos los objetos son comestibles, y no todos los objetos comestibles tienen los mismos efectos en el personaje. Algunos objetos, cuando se comen, se transforman en un objeto diferente (por ejemplo, si te comes una manzana, te queda el corazón de la manzana).

Para permitir toda esa flexibilidad, decidiste crear un protocolo Edible que algunos de los objetos pueden implementar.

1. Define la comestibilidad

Crea el protocolo RPG.Edible. El protocolo tiene una función: eat. La función eat acepta un objeto y un personaje, y devuelve un subproducto y un personaje.

2. Haz que las hogazas de pan sean comestibles

Implementa el protocolo RPG.Edible para el objeto RPG.LoafOfBread. Cuando se come, una hogaza de pan le da al personaje 5 puntos de vida y no tiene subproducto.

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

3. Haz que las pociones de maná sean comestibles

Implementa el protocolo RPG.Edible para el objeto RPG.ManaPotion. Cuando se come, una poción de maná le da al personaje tantos puntos de maná como la fuerza de la poción, y produce una botella vacía.

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

4. Haz que los venenos sean comestibles

Implementa el protocolo RPG.Edible para el objeto RPG.Poison. Cuando se come, un veneno le quita todos los puntos de vida al personaje, y produce una botella vacía.

RPG.Edible.eat(%RPG.Poison{}, %RPG.Character{health: 3000})
# => {%RPG.EmptyBottle{}, %RPG.Character{health: 0, mana: 0}}
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Elixir Exercism

¿Todo listo para empezar Pan y pociones?

Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.