<> 运算符在 Slick 中的作用是啥?
Posted
技术标签:
【中文标题】<> 运算符在 Slick 中的作用是啥?【英文标题】:What does the <> operator do in Slick?<> 运算符在 Slick 中的作用是什么? 【发布时间】:2016-06-20 19:40:00 【问题描述】:我正在通过documentation of Slick 设置一个快速工作的原型。
在“映射表”部分中,我在提到的示例中看到了 <>
运算符,但在任何地方都找不到任何文档。需要帮助来理解这一点。
【问题讨论】:
【参考方案1】:<>
运算符定义了Table
中的Row
和case class
之间的关系。
case class User(id: Option[Int], first: String, last: String)
ROW |id | first | last |
因此,数据首先从表中取出为n-tuple
(<>
的左侧),然后转换为case class
(<>
的右侧)。
要使案例类的转换工作,需要两种方法:
Row
到 n-tuple
到 case class
。
scala> User.tupled
res6: ((Option[Int], String, String)) => User = <function1>
所以当给定一个三元组(Option[Int], String, String)
作为参数时,这个函数可以创建一个User
。
case class
到 n-tuple
要写入 DB。
scala> User.unapply _
res7: User => Option[(Option[Int], String, String)] = <function1>
这个函数提供了相反的功能。给定一个用户,它可以提取一个三元组。这种模式称为Extractor
。在这里您可以了解更多信息:http://www.scala-lang.org/old/node/112
【讨论】:
所以在右侧我看到了 User.tupled, user.unapply 。你能解释一下右边发生了什么吗? 给你。添加了解释。 好的,现在我明白了。最后一个问题。我们在元组上调用方法 。但它是在 ShapedValue 类中定义的。 Scala 是如何推断的?一些隐式转换? ProvenShape 对象中的proveShapeOf(v:T) 方法是否进行隐式转换?【参考方案2】:不是scala操作符,是slick的ShapedValue类定义的方法
正如您在链接的文档中看到的那样,它用于在提供两种方法的案例类之间映射投影
def * = (id.?, first, last) <> (User.tupled, User.unapply)
【讨论】:
【参考方案3】:如果你 clone the Slick source repo 和 grep 为 def <>
,你会发现 <>
是 ShapedValue
的一个方法,它返回一个 MappedProjection
。
【讨论】:
是的,检查代码有很大帮助。我对 Scala 仍然很陌生,因此经常对明显的事情产生怀疑。 :D 谢谢! 所以我看到在元组上调用了 方法。 scala 如何解析 ShapedValue 对象上的方法?我认为它是通过隐式转换完成的,但无法弄清楚。如果我需要提出另一个问题,请告诉我。 搜索正则表达式implicit.*def.*: ShapedValue
,看起来提供ShapedValue
的隐式来自BasicProfile
。虽然我对 Slick 一点也不熟悉,而且由于您链接到的文档不包含任何导入语句,我不确定该隐式如何进入范围。您可能想提出另一个问题。以上是关于<> 运算符在 Slick 中的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章