【问题标题】:Can both unapply and unapplySeq be defined in the same extractor可以在同一个提取器中同时定义 unapply 和 unapplySeq
【发布时间】:2018-05-04 16:13:46
【问题描述】:

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    根据这个相当过时但仍然信息丰富的Scala blog entry

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

    事实上,测试似乎证实了这一点。一种或另一种有效,但不能两者兼而有之。


    编译器错误解释

    由于可变参数表示法 (_*),模式 A(a, b, _*) 只能被 unapplySeq() 识别,但如果您同时定义了 unapply()unapplySeq(),则只能看到 unapply() 并且编译器无法使模式符合方法定义。

    如果您注释掉 unapply() 定义,unapplySeq() 将识别并解析您的任一 case 模式(以先到者为准,因为它们都匹配)。

    【讨论】:

    • 感谢@jwvh 的回答,很有道理。
    猜你喜欢
    • 2021-01-30
    • 2021-10-11
    • 1970-01-01
    • 2011-01-09
    • 2022-01-26
    • 1970-01-01
    • 2019-10-12
    • 2013-04-12
    • 2023-02-07
    相关资源
    最近更新 更多