gpt4 book ai didi

class - 带有行为的 Scala 案例类

转载 作者:行者123 更新时间:2023-12-04 23:02:10 26 4
gpt4 key购买 nike

我有一个 Scala 案例类,它具有某些 val 作为参数。我有几个方法可以使用这个案例类。假设我的案例类定义如下:

case class CaseA(a: Int, b: List[CaseB])
case class CaseB(a: Int, b: text, c: Boolean)

CaseA 和 CaseB 都代表我的案例类的域模型。但是当我在我的应用程序中使用它们时,我想根据 CaseB 的 bool 字段向 CaseA 添加一些行为。例如,让我们假设在 CaseA 中,val b 有 4 个 CaseB 对象。我想添加一个通过 b 运行的行为,并告诉我 CaseB 中的任何一个元素是否将 val c 设置为 true。

我想出的是以下 CaseA 的实现:
case class CaseA(a: Int, b: List[CaseB], c: Boolean)

但是这种方法的问题是,当我从数据库加载我的 CaseA 对象时,我不需要有 val c,因为 val c 是计算的,而不是 CaseA 对象的一部分。我更进一步,将我的 CaseA 修改为如下所示:
case class CaseA(a: Int, b: List[CaseB], c: Option[Boolean])

我可以看到它已经变得丑陋了。如何向我的案例类添加行为,以便 val c 不需要成为 CaseA 对象的一部分,而是每次在运行时计算?

最佳答案

如果您不需要所有元素的 c,我将使用惰性值

case class CaseB(a:Int,b:String,c:Boolean)
case class CaseA(a:Int,b:List[CaseB]){
lazy val c = b exists (_.c)
}

val ca = CaseA(42, List(
CaseB(1,"hello",false),
CaseB(2,",",false),
CaseB(3,"world",true))
)

println(ca.c)

要回答您的一些评论问题,如果您想使用 mixin-trait,您可以执行以下操作:
case class CaseB(a:Int,b:String,c:Boolean)
case class CaseA(a:Int,b:List[CaseB])
trait CanCheck extends CaseA{
lazy val c = b exists (_.c)
}

val ca = new CaseA(42, List(
CaseB(1,"hello",false),
CaseB(2,",",false),
CaseB(3,"world",true))
) with CanCheck

println(ca.c)

请注意,您需要使用 new使这项工作的关键字

关于class - 带有行为的 Scala 案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20610975/

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