是否可以在没有宏的情况下编写无形 Generic.from 的模拟
Is it possible to write analog of shapeless Generic.from without macros
我正在编写我自己的简约 HList
/Generic
实现来为我自己的几个案例 class 派生编码器。
我写了ToTuple
证据,但是我所有的案例class都有超过22个成员,所以我不能使用tupled
功能。另外我想尽可能避免使用宏。
是否可以在不使用宏的情况下将 HList 转换为大小写 class?
除了限制之外,我的用例也有一些缓解(不确定它们是否可以提供帮助):
- 没有密封的特征,只有情况classes
- 我需要解码的所有案例 class 都在我的库中,因此我可以在它们的定义中添加最少的样板文件
将 case class 转换为 hlist 可能使用 .productIterator
。
但是将 hlist 转换为大小写 class 可以使用宏(或无形的,其中宏在引擎盖下使用)或编写
之类的方法
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)
}
}
每个案例 class。问题是你不会写
def from[T](x: ...): T = new T(...) //pseudocode
没有宏(或反射)。
我正在编写我自己的简约 HList
/Generic
实现来为我自己的几个案例 class 派生编码器。
我写了ToTuple
证据,但是我所有的案例class都有超过22个成员,所以我不能使用tupled
功能。另外我想尽可能避免使用宏。
是否可以在不使用宏的情况下将 HList 转换为大小写 class?
除了限制之外,我的用例也有一些缓解(不确定它们是否可以提供帮助):
- 没有密封的特征,只有情况classes
- 我需要解码的所有案例 class 都在我的库中,因此我可以在它们的定义中添加最少的样板文件
将 case class 转换为 hlist 可能使用 .productIterator
。
但是将 hlist 转换为大小写 class 可以使用宏(或无形的,其中宏在引擎盖下使用)或编写
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)
}
}
每个案例 class。问题是你不会写
def from[T](x: ...): T = new T(...) //pseudocode
没有宏(或反射)。