可以在同一提取器中定义unapply和unapplySeq

时间:2018-05-04 00:08:24

标签: scala

我有以下代码,旨在在同一个提取器中定义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?

1 个答案:

答案 0 :(得分:4)

根据这个相当陈旧但仍然提供信息的Scala blog entry

  

注意:如果同时定义了unapply和unapplySeq,则仅使用unapply。

事实上,测试似乎证实了这一点。一个或另一个工作,但不是两个。

解释

编译器错误

由于varargs表示法(_*),A(a, b, _*)模式只能由unapplySeq()识别,但如果您同时拥有unapply()unapplySeq()定义然后只看到unapply(),编译器无法使模式符合方法定义。

如果您对unapply()定义发表评论,则unapplySeq()会识别并解析您的case模式中的任何一种模式(因为它们都匹配,所以最先出现的模式)。