O tipo Option é usado para representar valores que podem estar ausentes ou presentes.
Ele é definido no módulo gleam/option da seguinte forma:
type Option(a) {
Some(a)
None
}
O construtor Some é usado para envolver um valor quando ele está presente, e o construtor None é usado para representar a ausência de um valor.
Acessar o conteúdo de um Option costuma ser feito por meio de casamento de padrões.
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 uma série de funções úteis para trabalhar com tipos Option, como unwrap, que retorna o conteúdo de um Option ou um valor padrão se ele for 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á trabalhando em um novo jogo de RPG e precisa da sua ajuda para implementar algumas das mecânicas.
Implemente a função introduce.
Jogadores furtivos podem estar escondendo o nome e devem ser apresentados como "Mighty Magician".
Caso contrário, basta usar o nome do jogador para apresentá-lo.
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 se o personagem do jogador está mesmo morto (a vida dele chegou a 0).
Se estiver, ela deve retornar uma nova instância de Player com 100 de vida.
Caso contrário, se o personagem do jogador não estiver morto, a função revive retorna None.
Se o nível do jogador for 10 ou mais, ele também deve ser revivido com 100 de mana.
Se o nível do jogador for menor que 10, a mana dele deve permanecer 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 em um jogador cuja vida é 1 ou mais, a função deve retornar 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, além de um Player.
Ela retorna o jogador atualizado, bem como a quantidade de dano que o feitiço lançado causa.
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 permanece inalterado e nenhum dano é causado.
Se o jogador nem sequer tiver uma reserva de mana, tentar lançar o feitiço deve diminuir a vida dele pelo custo de mana do feitiço e não causa dano.
Fique atento: a vida do jogador não pode ficar abaixo de 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
Crie sua conta no Exercism para aprender e dominar Gleam com 33 conceitos122 exercícios e mentoria humana de verdade, tudo de graça.