Scala 如何在无形状中创建生成的对象
假设我有一个通用类型的规范化数据库模型,如下所示:Scala 如何在无形状中创建生成的对象,scala,generic-programming,shapeless,Scala,Generic Programming,Shapeless,假设我有一个通用类型的规范化数据库模型,如下所示: case class BaseModel(id: String, createdBy: String, attr1: Option[String] = None, attr2: Option[Int] = None, attr3: Option[LocalDate] = No
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
给定一系列BaseModel,如果某个选项属性的所有字段都没有填充,shapeless能为我创建一个简化模型吗
例如,假设所有attr1字段都为空。无需在手之前指定对象,shapeless可以创建一个类似这样的通用对象吗
case class BaseModel(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
Shapeless可以做的是,给定两个case类,从另一个的对象创建其中一个的对象
import java.time.LocalDate
import shapeless.LabelledGeneric
import shapeless.record._
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
case class BaseModel1(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
val bm = BaseModel(
id = "cff4545gvgf",
createdBy = "John Doe",
attr2 = Some(42),
attr3 = Some(LocalDate.parse("2018-11-03"))
) // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
val hlist = LabelledGeneric[BaseModel].to(bm)
val hlist1 = hlist - 'attr1
val bm1 = LabelledGeneric[BaseModel1].from(hlist1)
// BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))
但是Shapess不能创建新的case类。如果您需要自动创建一个新的案例类,您可以编写一个宏。可能是这样吗?这是否意味着对于泛型,基础模型需要具有任何可能的子模型的所有字段?抱歉,我不理解您的问题。我想没有。我想是的。具有类型A、b、c、d的ChildModel1和具有类型A、b、c、d、e的ChildModel2都必须扩展具有类型A、b、c、d、e的BaseModel。BaseModel必须包含任何子模型中使用的所有类型的乘积。Shapess所做的是从case类转换到某个通用表示hlist,反之亦然。您可以使用hlist、添加字段、删除字段、转换字段来完成所有操作。Shapess不能做的是定义case类。