Le type Option sert à représenter des valeurs qui peuvent être soit absentes, soit présentes.
Il est défini dans le module gleam/option comme suit :
type Option(a) {
Some(a)
None
}
Le constructeur Some sert à envelopper une valeur lorsqu'elle est présente, et le constructeur None sert à représenter l'absence de valeur.
On accède souvent au contenu d'une Option par filtrage par motif.
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!"
Le module gleam/option définit aussi un certain nombre de fonctions utiles pour manipuler les types Option, comme unwrap, qui renvoie le contenu d'une Option ou une valeur par défaut si celle-ci vaut None.
import gleam/option.{type Option}
pub fn say_hello_again(person: Option(String)) -> String {
let name = option.unwrap(person, "Friend")
"Hello, " <> name <> "!"
}
Josh travaille sur un nouveau jeu de rôle et a besoin de ton aide pour implémenter certaines mécaniques.
Implémente la fonction introduce.
Les joueurs furtifs peuvent cacher leur nom et seront alors présentés sous le nom de "Mighty Magician". Sinon, utilise simplement le nom du joueur pour le présenter.
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 fonction revive doit vérifier que le personnage du joueur est bien mort (sa santé a atteint 0).
Si c'est le cas, elle doit renvoyer une nouvelle instance de Player avec 100 points de santé.
Sinon, si le personnage du joueur n'est pas mort, la fonction revive renvoie None.
Si le niveau du joueur est supérieur ou égal à 10, il doit également être réanimé avec 100 points de mana.
Si le niveau du joueur est inférieur à 10, son mana ne doit pas être modifié.
La fonction revive doit préserver le niveau du joueur.
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 la méthode revive est appelée sur un joueur dont la santé est supérieure ou égale à 1, la fonction doit renvoyer None.
let alive_player = Player(name: None, level: 2, health: 42, mana: None)
revive(alive_player)
// -> None
La fonction cast_spell prend en arguments un Int indiquant combien de mana coûte le sort, ainsi qu'un Player.
Elle renvoie le joueur mis à jour, ainsi que la quantité de dégâts infligés par le sort lancé.
Un sort lancé avec succès inflige des dégâts égaux à deux fois le coût en mana du sort.
Cependant, si le joueur n'a pas assez de mana, rien ne se passe : le joueur reste inchangé et aucun dégât n'est infligé.
Si le joueur ne dispose même pas d'une réserve de mana, tenter de lancer le sort doit réduire sa santé du coût en mana du sort et n'inflige aucun dégât.
Attention, la santé du joueur ne peut pas être inférieure à zéro (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
Inscris-toi sur Exercism pour apprendre et maîtriser Gleam avec 33 concepts122 exercices, et un vrai mentorat humain, le tout gratuitement.