加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 覆盖unapply方法

发布时间:2020-12-16 09:57:45 所属栏目:安全 来源:网络整理
导读:我有一个来自库类的案例,我想重写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 o
我有一个来自库类的案例,我想重写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 _ => ??? 
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读