所以我试图找出是否可以使用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
。