E1041

E1041#

闭合的字典模式

MoonBit 的字典模式匹配语法不支持闭合的模式(即要求字典中不能包含其他未被匹配的字段)。所以字典模式必须包含 .. 来忽略余下的字段,否则编译器会发出一个警告。

错误示例#

fn f(map : Map[String, Int]) -> Unit {
  match map {
    // 这一行会匹配字典中包含 "x" 和 "y" 以外的字段的情况
    { "x": x, "y": y } => println(x + y)
    _ => ()
  }
}

test {
 f({ "x": 1, "y": 2, "z": 3 })
}

建议#

  • 如果预期的语义是开放的匹配(允许存在其他未被匹配的字段),那么向模式中添加 .. 即可。

  • 如果预期的语义是闭合的匹配,可以用模式匹配中的卫语句来实现:

    fn f(map : Map[String, Int]) -> Unit {
      match map {
        { "x": x, "y": y, .. } if map.size() == 2 => println(x + y)
        _ => ()
      }
    }