我正在学习无形并引用来自 here 的教程.其中说,
Generic is a simple way to convert case class and product types (like tuples) to HList, and vice-versa:
import shapeless.Generic
case class UserWithAge(name: String, age: Int)
val gen = Generic[UserWithAge]
val u = UserWithAge("Julien", 30)
val h = gen.to(u)
现在,如果我打印
h
, 我会得到 Julien :: 30 :: HNil
.但是,我无法从 h
读取每个元素如 h.head
, h.tail
将不起作用,并且 h
中没有任何可用的方法.在这里,h
是 gen.Repr
的类型我想不出将它转换成 HList
的方法任何一个。那么,如何从 h
读取每个元素? ?
最佳答案
在这种情况下 gen.to(u)
的类型是 gen.Repr
, 如果你看一下 gen
的类型实际花费到String :: Int :: HNil
,所以它已经是 HList
!
scala> import shapeless.Generic
import shapeless.Generic
scala> case class UserWithAge(name: String, age: Int)
defined class UserWithAge
scala> val gen = Generic[UserWithAge]
gen: shapeless.Generic[UserWithAge]{type Repr = shapeless.::[String,shapeless.::[Int,shapeless.HNil]]} = anon$macro$3$1@4ff329b8
scala> val u = UserWithAge("Julien", 30)
u: UserWithAge = UserWithAge(Julien,30)
scala> val h = gen.to(u)
h: gen.Repr = Julien :: 30 :: HNil
scala> h.head
res0: String = Julien
scala> h.tail
res1: shapeless.::[Int,shapeless.HNil] = 30 :: HNil
在一般情况下,
Repr
Generic
的类型将是 HList
或 Coproduct
.有关如何对这些进行一般编程的示例,请参阅 shapeless-type-class-derivation-2015-demo .
关于Scala Shapeless - 迭代/读取 Generic.Repr 的每个项目或将其转换为 HList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42778251/