【问题标题】:Is it possible to write analog of shapeless Generic.from without macros是否可以在没有宏的情况下编写无形 Generic.from 的模拟
【发布时间】:2018-08-25 17:48:42
【问题描述】:
我正在编写我自己的简约HList/Generic 实现来为我自己的几个案例类派生编码器。
我设法写了ToTuple 证据,但是我所有的案例类都有超过22 个成员,所以我不能使用tupled 函数。如果可能的话,我也想避免使用宏。
是否可以将 HList 转换为没有宏的案例类?
除了限制之外,我的用例也有一些缓解(不确定它们是否能提供帮助):
- 没有密封的特征,只有案例类
- 我需要解码的所有案例类都在我的库中,因此我可以在它们的定义中添加最少的样板文件
【问题讨论】:
标签:
scala
shapeless
scala-macros
【解决方案1】:
使用.productIterator 可以将案例类转换为 hlist。
但是将 hlist 转换为 case 类可以使用宏(或在引擎盖下使用宏的无形)或编写方法,如
case class MyClass(i: Int, s: String, b: Boolean)
object MyClass {
def from(x: Int :: String :: Boolean :: HNil): MyClass = x match {
case i :: s :: b :: HNil => MyClass(i, s, b)
}
}
对于每个案例类。问题是你不会写
def from[T](x: ...): T = new T(...) //pseudocode
没有宏(或反射)。