O tipo Option serve para representar valores que podem estar ausentes ou presentes.
Está definido no módulo gleam/option da seguinte forma:
type Option(a) {
Some(a)
None
}
O construtor Some serve para envolver um valor quando este está presente, e o construtor None serve para representar a ausência de um valor.
Aceder ao conteúdo de um Option faz-se muitas vezes através de 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!"
O módulo gleam/option também define várias funções úteis para trabalhar com tipos Option, como unwrap, que devolve o conteúdo de um Option ou um valor predefinido, caso este seja None.
import gleam/option.{type Option}
pub fn say_hello_again(person: Option(String)) -> String {
let name = option.unwrap(person, "Friend")
"Hello, " <> name <> "!"
}
O Josh está a trabalhar num novo jogo de interpretação de papéis e precisa da tua ajuda para implementar algumas das mecânicas.
Implementa a função introduce.
Os jogadores furtivos podem estar a esconder o seu nome e serão apresentados como "Mighty Magician".
Caso contrário, usa apenas o nome do jogador para o apresentar.
introduce(Player(name: None, level: 2, health: 8, mana: None))
// -> "Mighty Magician"
introduce(Player(name: Some("Merlin"), level: 2, health: 8, mana: None))
// -> "Merlin"
A função revive deve verificar que a personagem do jogador está mesmo morta (a vida chegou a 0).
Se estiver, deve devolver uma nova instância de Player com 100 de vida.
Caso contrário, se a personagem do jogador não estiver morta, a função revive devolve None.
Se o nível do jogador for 10 ou superior, também deve ser revivido com 100 de mana.
Se o nível do jogador for inferior a 10, a mana deve ficar intacta.
A função revive deve preservar o nível do jogador.
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 o método revive for chamado num jogador cuja vida é 1 ou superior, a função deve devolver None.
let alive_player = Player(name: None, level: 2, health: 42, mana: None)
revive(alive_player)
// -> None
A função cast_spell recebe como argumentos um Int que indica quanta mana o feitiço custa, bem como um Player.
Devolve o jogador atualizado, bem como a quantidade de dano que o feitiço lançado provoca.
Um lançamento de feitiço bem-sucedido causa dano igual ao dobro do custo de mana do feitiço.
No entanto, se o jogador não tiver mana suficiente, nada acontece, o jogador fica inalterado e não é causado qualquer dano.
Se o jogador não tiver sequer uma reserva de mana, a tentativa de lançar o feitiço deve diminuir a sua vida pelo custo de mana do feitiço e não causa dano.
Tem em conta que a vida do jogador não pode ser inferior 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
Inscreve-te no Exercism para aprenderes e dominares Gleam com 33 conceitos122 exercícios, e mentoria humana real, tudo grátis.