映射模式
MoonBit 为类映射数据结构提供了便捷的模式匹配。在映射模式 { key1: pattern1, key2?: pattern2, .. }
中:
-
key1: pattern1
部分要求key1
存在于映射中,且与之关联的值能够匹配指定的pattern1
。 -
key2?: pattern2
部分无论key2
是否存在都会匹配;在这种情况下,pattern2
将匹配一个Option
类型的值,如果key2
在映射中存在,这个值会是Some(value)
, 否则为None
。 -
..
部分表示该模式可以静默匹配没有声明的键值对,这个标记在映射模式中总是必需的。
这个示例展示了如何使用映射模式来处理用户配置。process_config
函数可以处理不同的配置,并在某些键缺失时提供适当的默认值。
///|
fn process_config(config : Map[String, String]) -> String {
match config {
// Pattern 1: Must have "name" key, optional "theme" key
{ "name": username, "theme"? : Some(theme), .. } =>
"Welcome \{username}! Using \{theme} theme."
// Pattern 2: Must have "name" key, theme is missing
{ "name": username, "theme"? : None, .. } =>
"Welcome \{username}! Using default theme."
// Pattern 3: Missing required "name" key
{ "theme": theme, .. } => "Guest user with \{theme} theme."
// Pattern 4: Empty or other configurations
_ => "Guest user with default settings."
}
}
///|
fn main {
// Test different configurations
let config1 = { "name": "Alice", "theme": "dark", "language": "en" }
let config2 = { "name": "Bob", "language": "zh" }
let config3 = { "theme": "light", "timeout": "30" }
let config4 = {}
println(process_config(config1))
println(process_config(config2))
println(process_config(config3))
println(process_config(config4))
}