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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |