El tipo Option se usa para representar valores que pueden estar ausentes o presentes.
Se define en el módulo gleam/option como sigue:
type Option(a) {
Some(a)
None
}
El constructor Some se usa para envolver un valor cuando está presente, y el constructor None se usa para representar la ausencia de un valor.
Acceder al contenido de un Option se hace a menudo mediante coincidencia de patrones.
import gleam/option.{type Option, None, Some}
pub fn say_hello(person: Option(String)) -> String {
case person {
Some(name) -> "Hello, " <> name <> "!"
None -> "Hello, Friend!"
}
}
say_hello(Some("Matthieu"))
// -> "Hello, Matthieu!"
say_hello(None)
// -> "Hello, Friend!"
El módulo gleam/option también define varias funciones útiles para trabajar con tipos Option, como unwrap, que devuelve el contenido de un Option o un valor por defecto si es None.
import gleam/option.{type Option}
pub fn say_hello_again(person: Option(String)) -> String {
let name = option.unwrap(person, "Friend")
"Hello, " <> name <> "!"
}
Josh está trabajando en un nuevo juego de rol y necesita tu ayuda para implementar algunas de las mecánicas.
Implementa la función introduce.
Los jugadores sigilosos pueden estar ocultando su nombre y se les presentará como "Mighty Magician".
En caso contrario, usa simplemente el nombre del jugador para presentarlo.
introduce(Player(name: None, level: 2, health: 8, mana: None))
// -> "Mighty Magician"
introduce(Player(name: Some("Merlin"), level: 2, health: 8, mana: None))
// -> "Merlin"
La función revive debe comprobar que el personaje del jugador está realmente muerto (su salud ha llegado a 0).
Si es así, debe devolver una nueva instancia de Player con 100 de salud.
En caso contrario, si el personaje del jugador no está muerto, la función revive devuelve None.
Si el nivel del jugador es 10 o superior, también debe revivir con 100 de maná.
Si el nivel del jugador es inferior a 10, su maná no debe tocarse.
La función revive debe conservar el nivel del jugador.
let dead_player = Player(name: None, level: 2, health: 0, mana: None)
revive(dead_player)
// -> Some(Player(name: None, level: 2, health: 100, mana: None))
Si se llama al método revive sobre un jugador cuya salud es 1 o superior, la función debe devolver None.
let alive_player = Player(name: None, level: 2, health: 42, mana: None)
revive(alive_player)
// -> None
La función cast_spell toma como argumentos un Int que indica cuánto maná cuesta el hechizo, así como un Player.
Devuelve el jugador actualizado, así como la cantidad de daño que inflige el hechizo lanzado.
Un lanzamiento de hechizo exitoso inflige un daño igual al doble del coste de maná del hechizo.
Sin embargo, si el jugador no tiene maná suficiente, no ocurre nada, el jugador no cambia y no se inflige daño.
Si el jugador ni siquiera tiene una reserva de maná, el intento de lanzar el hechizo debe reducir su salud en el coste de maná del hechizo y no inflige daño.
Ten en cuenta que la salud del jugador no puede estar por debajo de cero (0).
let wizard = Player(name: None, level: 18, health: 123, mana: Some(30))
let #(wizard, damage) = cast_spell(wizard, 14)
wizard.mana // -> Some 16
damage // -> 28
Regístrate en Exercism para aprender y dominar Gleam con 33 conceptos122 ejercicios y mentoría humana real, todo gratis.