在UnapplySeq中嵌套Unapply

时间:2018-04-20 17:00:07

标签: scala

所以我试图找出是否可以使用unapply嵌套 unapplySeq

对于上下文,我使用Scala正则表达式库来解构数字并将它们计算为字符串表示。

即。 101 =一百一个

鉴于一个案例:

val tripleDigit: Regex = """^(\d)(\d)(\d)$""".r

def numberToString(num: Int): String = num.toString match {
    case tripleDigit(d1, d2, d3) => //turn into string
    //other cases
}

这一切都按预期工作,直到我需要考虑使用其他数字无法评估为字符串的青少年数字(11到19)

即。 31 => 30 = 30 + 1 = 1

可以通过警卫来完成

case tripleDigit(d1, d2, d3) if isTeen(d1 + d2) => //turn into string

但很想知道它是否可以作为提取的一部分来完成

object Teen{
    def unapply(arg: Seq[String]): Option[(String, String)] = {
      arg match {
        case d1 :: d2 :: Nil if isTeen(d1 + d2) => Some(d1 -> d2)
        case _ => None
      }
    }
  }

然后添加到案例陈述中

case tripleDigit(d1, Teen(d2, d3)) => //turn into string

这不起作用,unapplySeq提取到类似varargs的值,我似乎无法将unapply作为List[String]提供给每个匿名元素作为字符串)

据我所知,将剩余元素作为列表的唯一方法是使用_*

case tripleDigit(d1, dn @ _*) => //turn into string

我的问题是如何将剩余的_*元素列表提供给Unapply

0 个答案:

没有答案