Scala: регистр совпадений? - PullRequest
       16

Scala: регистр совпадений?

0 голосов
/ 29 января 2020

У меня есть черта с двумя классами: C1, имеющая имя (String) и потомки (List of String), и C2, имеющая текст (String). По сути, я хочу выбрать все классы C2, чтобы получить текст в их строке. Однако эти классы C2 являются потомками классов C1. Например, это выглядит так: C1("first", List(C1("firstchild", List(C2("text")))).

Моя идея состояла в том, чтобы сделать рекурсивный случай совпадения, который останавливается, когда он находит класс C2, чтобы дать мне текст внутри него. Если вместо этого он находит класс C1, он начинает заново с потомками этого класса (затем, если он находит класс C2, он дает мне текст, и, если он находит класс C1, если он начинается с его потомков, et c.). Но я застрял, чтобы сделать рекурсивную часть. Я имею в виду, похоже, что случаи совпадений сделаны только для определенного типа, поэтому я должен сделать каждый случай единичным?

Есть мысли, пожалуйста?

1 Ответ

1 голос
/ 30 января 2020
import scala.annotation.tailrec

trait C {
  def getName: String
}

case class C1(private val name: String, children: List[C]) extends C {
  @tailrec
  private def rec(children: Seq[C]): String = {
    children match {
      case Nil => name
      case h :: t => h match {
        case c1: C1 => rec(c1.children)
        case c2: C2 => c2.getName
      }
    }
  }

  def getName: String = rec(children)
}

case class C2(private val name: String) extends C {
  def getName: String = name
}
...