7za*_*rk7 7 scala pattern-matching
我正在尝试编写一个提取器,用于匹配多参数案例类.简化示例:
case class X(p1: String, p2: Int)
Run Code Online (Sandbox Code Playgroud)
我希望每个提取器对象为p1定义一个固定值,并在使用时定义p2.(A,B等不能是case类和子类X,我也想用X(,)作为例子)apply方法的例子:
object A {
def apply(p2: Int): X = X("A", p2)
}
object B {
def apply(p2: Int): X = X("B", p2)
}
...
Run Code Online (Sandbox Code Playgroud)
对于模式匹配,我希望它们匹配如下:
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
}
Run Code Online (Sandbox Code Playgroud)
我知道我需要定义unapply的方法A,B等等,但我彻底糊涂的签名和逻辑应该是什么:
object A {
def unapply(x: ???): Option[???] = {
???
}
}
Run Code Online (Sandbox Code Playgroud)
请帮忙吗?
Hei*_*ger 14
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)
...
Run Code Online (Sandbox Code Playgroud)
不过说实话,比如你想出没有可以改写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
}
Run Code Online (Sandbox Code Playgroud)