Scala:是否可以使用 (x+1) 之类的术语作为 case class 模式匹配的参数?
Scala: Is there a possibility to use terms like (x+1) as parameters for case class pattern matching?
假设以下情况
case class MyCaseClass(x: Int) // some case clas with an Int parameter
val x0 = 17 // some given Int value
val a = MyCaseClass(x=18) // a case class object
// using pattern matching to find out if *a* is of type MyCaseClass and its parameter x equals x0+1
a match {
case MyCaseClass(x) if x == x0+1 => println("Found my case class with x==x0+1")
}
问题
如果可以跳过上面的 if 语句 if x == x0+1
并只写
就好了
case MyCaseClass(x0+1) => println("Found my case class with x==x0+1")
不幸的是,这无法编译 - 但有什么方法可以实现这样的目标吗?
好吧,你可以 case MyCaseClass(18)
或者如果你真的需要做算术,你可以:
val x1 = x0 + 1
a match {
case MyCaseClass(`x1`) => ???
}
如果您定义提取器对象,您就可以完成这项工作
object `+` {
def unapply(x: Int): Option[(Int, Int)] = Some(x - 1, 1)
}
a match {
case MyCaseClass(x0 + 1) => println(x0) // 17
}
这也行
a match {
case MyCaseClass(x0 + _) => println(x0) // 17
}
请注意,使用不同的值会爆炸
a match {
case MyCaseClass(x0 + 2) => println(x0) // MatchError
}
您不能从 sum 的值中恢复两个被加数。
还有一个选择是
object `+1` {
def unapply(x: Int): Option[Int] = Some(x - 1)
}
a match {
case MyCaseClass(`+1`(x0)) => println(x0) // 17
}
或
object `+1` {
def unapply(x: Int): Option[(Int, Int)] = Some(x - 1, 42)
}
a match {
case MyCaseClass(x0 `+1` _) => println(x0) // 17
}
老实说,我认为这不值得。
假设以下情况
case class MyCaseClass(x: Int) // some case clas with an Int parameter
val x0 = 17 // some given Int value
val a = MyCaseClass(x=18) // a case class object
// using pattern matching to find out if *a* is of type MyCaseClass and its parameter x equals x0+1
a match {
case MyCaseClass(x) if x == x0+1 => println("Found my case class with x==x0+1")
}
问题
如果可以跳过上面的 if 语句 if x == x0+1
并只写
case MyCaseClass(x0+1) => println("Found my case class with x==x0+1")
不幸的是,这无法编译 - 但有什么方法可以实现这样的目标吗?
好吧,你可以 case MyCaseClass(18)
或者如果你真的需要做算术,你可以:
val x1 = x0 + 1
a match {
case MyCaseClass(`x1`) => ???
}
如果您定义提取器对象,您就可以完成这项工作
object `+` {
def unapply(x: Int): Option[(Int, Int)] = Some(x - 1, 1)
}
a match {
case MyCaseClass(x0 + 1) => println(x0) // 17
}
这也行
a match {
case MyCaseClass(x0 + _) => println(x0) // 17
}
请注意,使用不同的值会爆炸
a match {
case MyCaseClass(x0 + 2) => println(x0) // MatchError
}
您不能从 sum 的值中恢复两个被加数。
还有一个选择是
object `+1` {
def unapply(x: Int): Option[Int] = Some(x - 1)
}
a match {
case MyCaseClass(`+1`(x0)) => println(x0) // 17
}
或
object `+1` {
def unapply(x: Int): Option[(Int, Int)] = Some(x - 1, 42)
}
a match {
case MyCaseClass(x0 `+1` _) => println(x0) // 17
}
老实说,我认为这不值得。