MoonBit 语言导览 MoonBit

match 表达式中的模式

在这个例子中,我们定义了一个描述文件系统的 Resource 类型。Resource 可以是一个文本文件、一个图像,或者是一个包含更多文件的文件夹。

count 函数递归地遍历输入 res,并使用 match 表达式返回 ImageTextFile 的数量。

match 表达式具有第一个匹配语义。它会从第一个分支到最后一个分支依次尝试找到第一个匹配的模式,并执行相应的匹配表达式。如果没有模式匹配,程序将中止。

match 表达式的返回值是 Int 类型,因为所有分支的结果类型都是相同的 Int

模式可以是嵌套的。如果你不关心枚举构造器中的数据,可以使用任意模式(写作 _)来代替引入新变量。

enum Resource {
  TextFile(String)
  Image(String)
  Folder(Map[String, Resource])
} derive(Show)

let assets : Resource = Folder(
  {
    "readme.md": TextFile("hello world"),
    "image.jpg": Image("https://someurl1"),
    "folder1": Folder(
      {
        "src1.mbt": TextFile("some code1"),
        "src2.mbt": TextFile("some MoonBit code 2"),
      },
    ),
    "folder2": Folder(
      {
        "src3.mbt": TextFile("some code3"),
        "image2.jpg": Image("https://someurl2"),
      },
    ),
  },
)

fn main {
  println("resource count: \{count(assets)}")
}

fn count(res : Resource) -> Int {
  match res {
    Folder(map) => {
      let mut sum = 0
      for name, res in map {
        sum += count(res)
      }
      sum
    }
    TextFile(_) => 1
    Image(_) => 1
  }
}