我有一个匹配语句,例如:
i match {
case x if x == 0 ⇒
romanNumeral
case x if x >= 1000 ⇒
this.roman(i - 1000, s"${romanNumeral}M")
case x if x >= 900 ⇒
this.roman(i - 900, s"${romanNumeral}CM")
// etc.
视其格式而定,可能约为30行冗余代码。因此,我想知道是否可以使此代码更加干燥。
所以我创建了一个局部函数:
private def toRoman(upperGuard: Int, token: String, romanNumeral: String): String = {
case value: Int if value >= upperGuard ⇒
this.roman(upperGuard - 1, s"$romanNumeral$token")
}
然后我尝试将其包含在上述匹配器中:
i match {
case x if x == 0 ⇒
romanNumeral
toRoman(1000, "M", romanNumeral)
toRoman(900, "CM", romanNumeral)
// etc.
...但是,这将不起作用,因为Scala的编译器无法识别这些功能,它们是要查找的case语句。
有什么办法可以使这项工作?
因此,您基本上想使代码的重复性降低,首先是第一件事:
Ps:该函数没有做某些事情
您没有模式匹配表达式,您只是在编写if else
语句。如果要返回一个函数,则应输入:x => this.something(x,"foo-bar")
您不需要case x
。如果LHS case x
上只有一个表达式,则不需要模式匹配,可以只使用if else
。没有类层次结构的模式匹配没有任何意义。