我有以下代码,旨在在同一个提取器中定义unapply和unapplySeq
test("pattern matching define unapply and unapplySeq") {
object A {
def unapply(arg: String): Option[(String, String)] = Some((arg, arg))
def unapplySeq(arg: String): Option[Seq[String]] = Some(arg.split(" "))
}
def x = "hello world"
x match {
case A(a, b) => println("unapply matched", a, b)
case A(a, b, _*) => println("unapplySeq matched", a, b)
}
}
但它似乎不起作用,当我运行此测试用例时,它会导致编译错误并抱怨
Error:(292, 12) Star pattern must correspond with varargs or unapplySeq
case A(a, b, _*) => println("unapplySeq matched", a, b)
我想知道是否可以在同一个提取器中定义unapply和unapplySeq?
答案 0 :(得分:4)
根据这个相当陈旧但仍然提供信息的Scala blog entry:
注意:如果同时定义了unapply和unapplySeq,则仅使用unapply。
事实上,测试似乎证实了这一点。一个或另一个工作,但不是两个。
解释编译器错误
由于varargs表示法(_*
),A(a, b, _*)
模式只能由unapplySeq()
识别,但如果您同时拥有unapply()
和unapplySeq()
定义然后只看到unapply()
,编译器无法使模式符合方法定义。
如果您对unapply()
定义发表评论,则unapplySeq()
会识别并解析您的case
模式中的任何一种模式(因为它们都匹配,所以最先出现的模式)。