覆盖unapply方法

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.这有什么问题?

Kar*_*l S 6

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)

您无法unapplyMyClass对象中定义自定义方法,因为它必须采用MyClass参数,并且已经有一个这样的方法 - 一个为案例类自动生成.因此,您必须在不同的对象中定义它(MyClassA在本例中).

Scala的模式匹配需要你的对象,并采用了一些unapplyunapplySeq方法给它,直到它变得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)