微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 _ => ??? 
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐