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方法应用于它,直到它获得一些具有与模式中指定的值匹配的值. 注意:如果我写了案例m @ MyClassA(1)=>,那么m变量将是MyClass类型. 编辑: a match { case MyClassA(x) => x // x is an Int,equal to a.a case _ => ??? } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |