假设您有如下的case类
case class Test1(a:String,b:Int,c:Char)
case class Test2(a:String,b:Int)
然后使用以下变量示例化类
val test1 = Test1("first",2,'3')
val test2 = Test2("1st",20)
有没有一种方法可以使用.copy
方法(或其他方法),将Test 2中的变量应用到Test1中,类似于
val test3 = test1.copy(test2) //Note this isn't valid scala code
// Result should be ("1st",20,'3')
如果这在纯scala中是不可能的,那么在Shapeless 1/2中如何实现呢(目前的代码是在Shapeless 1中,但是我们计划在某个时候升级到Shapeless 2)
2条答案
按热度按时间lf5gs5x21#
在shapeless 2.0.0中,这可以像这样完成,
请注意,这是对每个case类中字段顺序的假设,而不是使用字段标签信息。如果你有多个相同类型的字段,这可能容易出错:类型可能会对齐,但潜在语义可能会改变。
我们可以通过使用shapeless的
LabelledGeneric
来解决这个问题。LabelledGeneric
将case类的值Map到无形的可扩展记录,除了捕获字段值的类型外,还通过相应ScalaSymbol
的单例类型将字段名编码到类型中。通过一点额外的基础设施(我将很快添加到shapeless 2.1.0),这允许我们使用最少的样板文件安全地在case类之间Map,cczfrluj2#
+1无定形
将Scala case class对象复制到另一个case class,并在末尾添加额外的字段:
将Scala case类对象复制到另一个case类对象,并在开头添加额外的字段:
基本上,这是迄今为止我看到的避免列出所有字段的最佳方法。