Option 类型用于表示可以缺失或存在的值。
它在 gleam/option 模块中的定义如下:
type Option(a) {
Some(a)
None
}
Some 构造函数用于在值存在时将其包装起来,None 构造函数则用于表示值的缺失。
访问 Option 的内容通常通过模式匹配来完成。
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!"
gleam/option 模块还定义了许多用于处理 Option 类型的有用函数,例如 unwrap,它会返回 Option 的内容,如果为 None,则返回默认值。
import gleam/option.{type Option}
pub fn say_hello_again(person: Option(String)) -> String {
let name = option.unwrap(person, "Friend")
"Hello, " <> name <> "!"
}
Josh 正在开发一款新的角色扮演游戏,需要你帮忙实现其中的一些机制。
实现introduce函数。
潜行的玩家可能会隐藏自己的名字,介绍时会以"Mighty Magician"来称呼他们。否则,直接用玩家的名字来介绍即可。
introduce(Player(name: None, level: 2, health: 8, mana: None))
// -> "Mighty Magician"
introduce(Player(name: Some("Merlin"), level: 2, health: 8, mana: None))
// -> "Merlin"
revive函数应该检查玩家的角色确实已经死亡(生命值降到了 0)。如果是,就返回一个生命值为 100 的新Player实例。否则,如果玩家的角色没有死亡,revive函数就返回None。
如果玩家的等级在 10 级或以上,复活时还应该带有 100 点法力值。如果玩家的等级低于 10 级,则保留其原有的法力值。revive函数应该保留玩家的等级。
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))
如果对生命值为 1 或以上的玩家调用revive方法,那么函数应该返回None。
let alive_player = Player(name: None, level: 2, health: 42, mana: None)
revive(alive_player)
// -> None
cast_spell函数接收一个Int作为参数,表示法术消耗的法力值,同时还接收一个Player。它返回更新后的玩家,以及所施放法术造成的伤害值。法术成功施放时,造成的伤害等于该法术法力消耗的两倍。不过,如果玩家的法力值不足,就什么也不会发生:玩家保持不变,也不会造成任何伤害。如果玩家根本没有法力池,那么尝试施放法术会使其生命值减少该法术消耗的法力值,并且不造成伤害。注意,玩家的生命值不能低于零(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