Scala – 案例类和隐式参数和模式匹配
发布时间:2020-12-16 09:20:51 所属栏目:安全 来源:网络整理
导读:我试图将隐含的参数与案例类组合在一起,但是我被卡住了. case class C(i: Int)(implicit b: Boolean)val c1 = C(1)(true)implicit val b = trueval c2 = C(2)c1 match { case C(i)(b) = // doesn′t work case C(i,b) = // doesn′t work case C(i) = // wor
我试图将隐含的参数与案例类组合在一起,但是我被卡住了.
case class C(i: Int)(implicit b: Boolean) val c1 = C(1)(true) implicit val b = true val c2 = C(2) c1 match { case C(i)(b) => // doesn′t work case C(i,b) => // doesn′t work case C(i) => // works,but wanted: if (b) i else 0 } 根据Scala语言规范,由于编译器为案例类生成了提取器对象:我的隐式布尔值不是生成的case类的成员,所以它必须在第二个(隐式)参数列表中(我可以不幸的是,在伴侣对象的应用方法中找不到):
object c { def apply[tps](ps1 ). . .(psn): c[tps] = new c[Ts](xs1 ). . .(xsn) def unapply[tps](x: c[tps]) = if (x eq null) scala.None else scala.Some(x.xs11,. . .,x.xs1k) } 如何在创建时隐式提供的成员定义一个案例类? 解决方法
您可以使用隐式参数来定义一个案例类,但是如您所发现的那样,它们不可用于模式匹配.您可以随时编写自己的提取器:
case class C(i: Int)(implicit val b: Boolean) // You can't call this C because that seat is taken (can't overload the default unapply) object C_ { // In order to be able to select `b` here,// it needs to be declared as "implicit *val* b: Boolean" def unapply(in: C) = Some((in.i,in.b)) } c1 match { case C_(i,b) => ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |