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

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类的成员,所以它必须在第二个(隐式)参数列表中(我可以不幸的是,在伴侣对象的应用方法中找不到):

A case class definition of c[tps](ps1 ). . .(psn) with type parameters tps and value
parameters ps implicitly generates an extractor object (§8.1.8) which is defined as
follows:

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) => ...
}

(编辑:李大同)

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

    推荐文章
      热点阅读