是否可以使用部分函数分解Scala匹配语句?

问题描述 投票:0回答:2

我有一个匹配语句,例如:

    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语句。

有什么办法可以使这项工作?

scala switch-statement pattern-matching decomposition partialfunction
2个回答
0
投票

因此,您基本上想使代码的重复性降低,首先是第一件事:

  • Scala的编译器无法将这些函数识别为case语句,因为它们是函数;
  • 第二件事,那个功能实际上不是部分功能;
  • 最后,那些匹配可以这样,如果您找到一种通过分组某种功能来减少代码行的方法,就像您做的很棒,但我不会发现它们是多余的,除非您可以使用就像我说的那样。

Ps:该函数没有做某些事情


0
投票

您没有模式匹配表达式,您只是在编写if else语句。如果要返回一个函数,则应输入:x => this.something(x,"foo-bar")您不需要case x。如果LHS case x上只有一个表达式,则不需要模式匹配,可以只使用if else。没有类层次结构的模式匹配没有任何意义。

© www.soinside.com 2019 - 2024. All rights reserved.