通用#to,但带有字段名称?
Generic#to, but with Field Names?
使用 Generic#to
,我可以获得 case class
的 HList
表示:
import shapeless._
case class F(x: Int, y: String)
scala> Generic[F].to( F(1, "foo") )
res1: shapeless.::[Int,shapeless.::[String,shapeless.HNil]] =
1 :: foo :: HNil
但是,我想得到以下表示:
("x", 1) :: ("y", "foo") :: HNil
换句话说,除了 F
实例的字段值,我还想获取字段名称,即 x
和 y
。
我怎样才能得到这个表示?
您正在寻找 LabelledGeneric
。
为了打印字段,您可以使用 Fields
类型 class(来自 ops.record
包),如果您还导入了 record
包。
这是一个完整的例子
import shapeless._, record._, ops.record._
case class F(x: Int, y: String)
scala> LabelledGeneric[F].to(F(1, "foo")).fields
res1: shapeless.::[(Symbol with shapeless.tag.Tagged[String("x")], Int),shapeless.::[(Symbol with shapeless.tag.Tagged[String("y")], String),shapeless.HNil]] = ('x,1) :: ('y,foo) :: HNil
如果您还想将密钥转换为String
:
object keysToString extends Poly1 {
implicit def keyToName[A, B] = at[(Symbol with A, B)] { case (k, v) => (k.name, v) }
}
scala> LabelledGeneric[F].to(F(1, "foo")).fields.map(keysToString)
res2: shapeless.::[(String, Int),shapeless.::[(String, String),shapeless.HNil]] = (x,1) :: (y,foo) :: HNil
使用 Generic#to
,我可以获得 case class
的 HList
表示:
import shapeless._
case class F(x: Int, y: String)
scala> Generic[F].to( F(1, "foo") )
res1: shapeless.::[Int,shapeless.::[String,shapeless.HNil]] =
1 :: foo :: HNil
但是,我想得到以下表示:
("x", 1) :: ("y", "foo") :: HNil
换句话说,除了 F
实例的字段值,我还想获取字段名称,即 x
和 y
。
我怎样才能得到这个表示?
您正在寻找 LabelledGeneric
。
为了打印字段,您可以使用 Fields
类型 class(来自 ops.record
包),如果您还导入了 record
包。
这是一个完整的例子
import shapeless._, record._, ops.record._
case class F(x: Int, y: String)
scala> LabelledGeneric[F].to(F(1, "foo")).fields
res1: shapeless.::[(Symbol with shapeless.tag.Tagged[String("x")], Int),shapeless.::[(Symbol with shapeless.tag.Tagged[String("y")], String),shapeless.HNil]] = ('x,1) :: ('y,foo) :: HNil
如果您还想将密钥转换为String
:
object keysToString extends Poly1 {
implicit def keyToName[A, B] = at[(Symbol with A, B)] { case (k, v) => (k.name, v) }
}
scala> LabelledGeneric[F].to(F(1, "foo")).fields.map(keysToString)
res2: shapeless.::[(String, Int),shapeless.::[(String, String),shapeless.HNil]] = (x,1) :: (y,foo) :: HNil