gpt4 book ai didi

scala - 案例类和隐式参数以及模式匹配

转载 作者:行者123 更新时间:2023-12-03 14:47:22 25 4
gpt4 key购买 nike

我试图将隐式参数与案例类结合起来,但是我陷入了困境。

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语言规范,这是因为编译器为案例类生成了提取器对象:我的隐式 Boolean不是所得案例类的成员,因此它必须位于第二个(隐式)参数列表中(不幸的是,我在伴随对象的apply方法中找不到):


类型参数为 c[tps](ps1 ). . .(psn)和值的 tps的案例类定义
参数 ps隐式生成一个提取器对象(第8.1.8节),该对象定义为
如下:


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

关于scala - 案例类和隐式参数以及模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5315589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com