scala – 覆盖unapply方法

我有一个来自库类的案例,我想重写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"
  }
}

但我希望它只返回1.这有什么问题?

解决方法

case class MyClass(a: Int,d: Double /* and many more ones*/)
object MyClassA {
   def unapply(x: MyClass) = Some(x.a)
}

val a = new MyClass(1,55.0 /* and many more ones*/)

a match {
    case MyClassA(2) => ??? // does not match
    case MyClassA(1) => a   // matches
    case _ => ??? 
}

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

Scala中的模式匹配接受您的对象并将几个unapply和unapplySeq方法应用于它,直到它获得一些具有与模式中指定的值匹配的值.
MyClassA(1)匹配if MyClassA.unapply(a)== Some(1).

注意:如果我写了案例m @ MyClassA(1)=>,那么m变量将是MyClass类型.

编辑:

a match {
    case MyClassA(x) => x  // x is an Int,equal to a.a
    case _ => ??? 
}

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...