gpt4 book ai didi

Scala - 提取器未应用混淆

转载 作者:行者123 更新时间:2023-12-04 10:19:58 25 4
gpt4 key购买 nike

我正在尝试编写一个用于匹配多参数案例类的提取器。简化示例:

case class X(p1: String, p2: Int)

我希望每个提取器对象都为 p1 定义一个固定值,而 p2 是在使用时定义的。 (A、B等不能是case类和子类X,我也想用X(,)作为case)
应用方法示例:
object A {
def apply(p2: Int): X = X("A", p2)
}

object B {
def apply(p2: Int): X = X("B", p2)
}

...

对于模式匹配,我希望它们像这样匹配:
X("A", 2) match {
case A(2) => true // <- should match: p1="A" and p2=2
case A(_) => true // <- should match: p1="A" and p2=_
case X("A", _) => true // <- should match: p1="A" and p2=_
case A(1) => false // <- should not match
case B(2) => false // <- should not match: p1="B" and p2=2
}

我知道我需要定义 unapply A 中的方法, B等,但我完全混淆了签名和逻辑应该是什么:
object A {
def unapply(x: ???): Option[???] = {
???
}
}

请帮忙?

最佳答案

unapply接受 Any 并返回 Option无论你想提取什么。在您的情况下,这将是:

scala> case class X(p1: String, p2: Int)
defined class X

scala> object A {
| def unapply(target: Any): Option[Int] =
| PartialFunction.condOpt(target) {
| case X("A", p2) => p2
| }
| }
defined module A

scala> val A(x) = X("A", 1)
x: Int = 1

scala> val A(x) = X("B", 1)
scala.MatchError: X(B,1) (of class X)
...

但老实说,你想出的例子可以在没有 A 的情况下重写。和 B :
X("A",2) match {
case X("A", 2) => true
case X("A", 1) => false
case X("A", _) => true
case X("B", 2) => false
}

关于Scala - 提取器未应用混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11238543/

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