У меня есть выражение соответствия, подобное этому:
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, которые он ищет.
Есть ли способ заставить эту работу работать