我有一个 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
关键字来完成这项工作