match
表达式中的模式
在这个例子中,我们定义了一个描述文件系统的 Resource
类型。Resource
可以是一个文本文件、一个图像,或者是一个包含更多文件的文件夹。
count
函数递归地遍历输入 res
,并使用 match
表达式返回 Image
和 TextFile
的数量。
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
}
}