gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:28:00 26 4
gpt4 key购买 nike

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

Note: if both unapply and unapplySeq are defined only unapply is used.



事实上,测试似乎证实了这一点。一个或另一个有效,但不是两者都有效。

编译器错误解释

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

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

关于scala - 可以在同一个提取器中定义 unapply 和 unapplySeq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50165368/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com