6 scala
我有一个来自库类的case,我想重写unapply方法来减少我需要传递的参数数量来进行模式匹配.我这样做:
object ws1 {
// a library class
case class MyClass(a: Int, b: String, c: String, d: Double /* and many more ones*/)
// my object I created to override unapply of class MyClass
object MyClass {
def unapply(x: Int) = Some(x)
}
val a = new MyClass(1, "2", "3", 55.0 /* and many more ones*/)
a match {
case MyClass(x /*only the first one is vital*/) => x // java.io.Serializable = (1,2,3,55.0)
case _ => "no"
}
}
Run Code Online (Sandbox Code Playgroud)
但我希望它能够回归1.这有什么问题?
case class MyClass(a: Int, b: String, c: String, d: Double /* and many more ones*/)
object MyClassA {
def unapply(x: MyClass) = Some(x.a)
}
val a = new MyClass(1, "2", "3", 55.0 /* and many more ones*/)
a match {
case MyClassA(2) => ??? // does not match
case MyClassA(1) => a // matches
case _ => ???
}
Run Code Online (Sandbox Code Playgroud)
您无法unapply在MyClass对象中定义自定义方法,因为它必须采用MyClass参数,并且已经有一个这样的方法 - 一个为案例类自动生成.因此,您必须在不同的对象中定义它(MyClassA在本例中).
Scala的模式匹配需要你的对象,并采用了一些unapply和unapplySeq方法给它,直到它变得Some与匹配模式中指定的那些值.
MyClassA(1)匹配a如果MyClassA.unapply(a) == Some(1).
注意:如果我写了case m @ MyClassA(1) =>,那么m变量将是类型MyClass.
编辑:
a match {
case MyClassA(x) => x // x is an Int, equal to a.a
case _ => ???
}
Run Code Online (Sandbox Code Playgroud)