前言
在这一期的文章中,我将继续介绍 either,使用它构建树形结构,该结构允许我模拟 scala 的模式匹配来构建遍历方法。
在 java 中使用泛型数据,either 会成为接收两种类型之一的单一数据结构,这两种类型保存在 left 和 right 部分中。
在上一期文章的罗马数字解析器示例中,either 保存了 exception(左侧)或 integer(右侧),如图 1 所示:
图 1. either 抽象保存了两种类型的其中之一
在本示例中,either以如下的方式被填充:
either result = romannumeralparser.parsenumber("xlii");
scala 模式匹配
scala 的众多出色功能之一就是能够使用 模式匹配 进行调度(参阅 参考资料)。与描述相比,演示更简单一些,因此我们会考虑清单 1 中的函数,将数字分数转换为字母分数:
清单 1. 使用 scala 模式匹配根据分数调度字母分数
val valid_grades = set("a", "b", "c", "d", "f")
def lettergrade(value: any) : string = value match {
case x:int if (90 to 100).contains(x) => "a"
case x:int if (80 to 90).contains(x) => "b"
case x:int if (70 to 80).contains(x) => "c"
case x:int if (60 to 70).contains(x) => "d"
case x:int if (0 to 60).contains(x) => "f"
case x:string if valid_grades(x.touppercase) => x.touppercase
}
printf("amy scores %d and receives %s\n", 91, lettergrade(91))
printf("bob scores %d and receives %s\n", 72, lettergrade(72))
printf("sam never showed for class, scored %d, and received %s\n",
44, lettergrade(44))
printf("roy transfered and already had %s, which translated as %s\n",
"b", lettergrade("b"))
在 清单 1 中,函数的整