【发布时间】:2020-01-16 11:20:42
【问题描述】:
问题:
我有一个案例类Foo,它可以是任何东西。
我需要一个函数来创建密码查询。
这个新函数的签名应该是
def createQueryString[T](t: T): String = ???
示例:
我有 Foo 假设有两个成员
case class Foo(x: Int, y: String)
我需要将其转换为密码
CREATE (f:Foo { x: "1", y: "Hello" }) RETURN f
如果我将Foo(1, "Hello") 传递给上面提到的函数createQueryString
createQueryString[Foo](Foo(1, "Hello"))
到目前为止我尝试了什么?
我已经尝试使用shapeless 的Generic 和Aux 来实现这一目标
import shapeless._
case class Foo(x: Int, y: String)
def foo[T, HL <: HList](instance: T)(
implicit gen: Generic.Aux[T, HL]
): HL = {
gen.to(instance)
}
val myFoo = foo(Foo(1, "Hello"))
s"""CREATE (f:Foo { x: "${myFoo(0)}", y: "${myFoo(1)}" }) RETURN f"""
有什么方法可以使用这个foo(Foo(1, "Hello")) 在上面提到的createQueryString 内部实现?我想基本上将类型传递给这个函数。有点像
def createQueryString[T](t: T): String = {
val gen = foo(t) // to get the generic
s"""CREATE (t: T { x: "${gen(0)}", y: "${gen(1)}" }) RETURN t"""
}
类似的东西。但是这样做我得到以下错误
Error:(77, 22) could not find implicit value for parameter gen: shapeless.Generic.Aux[T,HL]
val gen = foo(t) // to get the generic
问题:
- 我在上次使用
Aux的实现中遗漏了什么? - 如何改进它使其足够通用以作为参数合并到密码查询中?案例类中可以有多个
x和y。
【问题讨论】:
-
@FahadSididiqui 嘿,你有有趣的用例。你见过新类型吗?是 Neo4j (我是其维护者) 的 Scala 驱动程序。在项目中,我们有一个待处理的discussion 关于如何支持这样的事情。你想加入讨论吗?
-
谢谢@LuisMiguelMejíaSuárez 当然,我会看看我是否可以在你的帖子上分享我的发现。