case class Cat(color: Int, isFat: Boolean)
case class Kitten(color: Int, isFat: Boolean)
我想从 Cat 构造 Kitten,但希望在不传递所有参数的情况下自动执行此操作(因此,如果我向 Cat / Kitten 添加更多字段,我不需要更改代码)。有没有一种紧凑的方法可以在scala中实现这一点?
val kitten = Cat(1,True).what_to_do_here? // compact & immune to code changes no need to change that line in case of added fields.
你想看看无形的 https://github.com/milessabin/shapeless.
import shapeless._
import shapeless.syntax._
case class Cat(color: Int, isFat: Boolean)
case class Kitten(color: Int, isFat: Boolean)
val kitten = Kitten(2, true)
val genCat = Generic[Cat]
val genKit = Generic[Kitten]
val cat: Cat = genCat.from(genKit.to(kitten))
println(cat)
Shapeless 是一个库通用编程。例如,通用类型类可以转换密封特征和案例类的任何层次结构的实例(例如Cat
and Kitten
)转换为通用表示(HList 和 Coproducts),然后返回到任何兼容的类层次结构中。之间的通用表示可以以类型安全的方式进行操作。
genKit.to(kitten)
需要一个Kitten
,并生成一个 HList2 :: true :: HNil
。因为这与通用表示兼容Cat
无需修改,它可以使用以下方式存储genCat.from
.
在这种情况下,Cat
and Kitten
几乎相同。如果类型的顺序不同,或者 Kitten 有额外的属性怎么办?如果每个属性的名称都很重要怎么办? Shapeless 中有大量有用的东西,可以通过操纵通用表示来轻松解决此类情况。看一眼this https://github.com/milessabin/shapeless/blob/master/examples/src/main/scala/shapeless/examples/labelledgeneric.scala例如,使用 LabelledGeneric(使用带标签的 HList,又名记录)转换某些类型 Book 的情况下,添加一个属性并将其存储到 ExtendedBook 中。所有这些都是类型安全的。
无形的does使用一些宏,但似乎只依赖其中的一小部分。 Shapeless 的用户不需要自己编写任何宏——繁重的工作是由 Scala 强大的类型系统完成的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)