Il tipo Option si usa per rappresentare valori che possono essere assenti o presenti.
È definito nel modulo gleam/option come segue:
type Option(a) {
Some(a)
None
}
Il costruttore Some viene usato per avvolgere un valore quando è presente, mentre il costruttore None rappresenta l'assenza di un valore.
Spesso si accede al contenuto di un Option tramite il pattern matching.
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!"
Il modulo gleam/option definisce anche diverse funzioni utili per lavorare con i tipi Option, come unwrap, che restituisce il contenuto di un Option oppure un valore predefinito se questo è None.
import gleam/option.{type Option}
pub fn say_hello_again(person: Option(String)) -> String {
let name = option.unwrap(person, "Friend")
"Hello, " <> name <> "!"
}
Josh sta lavorando a un nuovo gioco di ruolo e ha bisogno del tuo aiuto per implementare alcune delle sue meccaniche.
Implementa la funzione introduce.
I giocatori furtivi potrebbero nascondere il proprio nome e verranno presentati come "Mighty Magician". Altrimenti, usa semplicemente il nome del giocatore per 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 funzione revive dovrebbe verificare che il personaggio del giocatore sia effettivamente morto (la sua salute ha raggiunto 0).
Se lo è, dovrebbe restituire una nuova istanza di Player con 100 di salute.
Altrimenti, se il personaggio del giocatore non è morto, la funzione revive restituisce None.
Se il livello del giocatore è 10 o superiore, dovrebbe essere resuscitato anche con 100 di mana.
Se il livello del giocatore è inferiore a 10, il suo mana dovrebbe rimanere invariato.
La funzione revive dovrebbe preservare il livello del giocatore.
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))
Se la funzione revive viene chiamata su un giocatore la cui salute è 1 o superiore, allora dovrebbe restituire None.
let alive_player = Player(name: None, level: 2, health: 42, mana: None)
revive(alive_player)
// -> None
La funzione cast_spell prende come argomenti un Int che indica quanto mana costa l'incantesimo e un Player.
Restituisce il giocatore aggiornato, insieme alla quantità di danno che l'incantesimo lanciato infligge.
Un lancio riuscito infligge un danno pari al doppio del costo in mana dell'incantesimo.
Tuttavia, se il giocatore non ha mana a sufficienza, non succede nulla, il giocatore resta invariato e non viene inflitto alcun danno.
Se il giocatore non ha nemmeno una riserva di mana, tentare di lanciare l'incantesimo deve ridurre la sua salute del costo in mana dell'incantesimo e non infligge alcun danno.
Tieni presente che la salute dei giocatori non può essere inferiore a zero (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
Iscriviti a Exercism per imparare e padroneggiare Gleam con 33 concetti122 esercizi e il mentoring di persone reali, tutto gratis.