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类。