MoonBit 语言导览 MoonBit

映射模式

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))
}