Scala – 提取器无法应用混乱
发布时间:2020-12-16 19:21:43 所属栏目:安全 来源:网络整理
导读:我正在尝试编写一个提取器,用于匹配多参数案例类.简化示例: case class X(p1: String,p2: Int) 我希望每个提取器对象为p1定义一个固定值,并在使用时定义p2. (A,B等不能是case类和子类X,我也想用X(,)作为例子) 应用方法示例: object A { def apply(p2: Int)
|
我正在尝试编写一个提取器,用于匹配多参数案例类.简化示例:
case class X(p1: String,p2: Int) 我希望每个提取器对象为p1定义一个固定值,并在使用时定义p2. (A,B等不能是case类和子类X,我也想用X(,)作为例子) 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
}
我知道我需要在A,B等中定义unapply方法,但我完全混淆了签名和逻辑应该是什么: object A {
def unapply(x: ???): Option[???] = {
???
}
}
请帮忙吗? 解决方法
unapply接受Any并返回一个你想要提取的选项.在你的情况下,这将是:
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
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
