【发布时间】:2016-06-20 19:40:00
【问题描述】:
我正在通过documentation of Slick 设置一个快速工作的原型。
在“映射表”部分中,我在提到的示例中看到了 <> 运算符,但在任何地方都找不到任何文档。需要帮助来理解这一点。
【问题讨论】:
我正在通过documentation of Slick 设置一个快速工作的原型。
在“映射表”部分中,我在提到的示例中看到了 <> 运算符,但在任何地方都找不到任何文档。需要帮助来理解这一点。
【问题讨论】:
<> 运算符定义了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
【讨论】:
不是scala操作符,是slick的ShapedValue类定义的方法
正如您在链接的文档中看到的那样,它用于在提供两种方法的案例类之间映射投影
def * = (id.?, first, last) <> (User.tupled, User.unapply)
【讨论】:
如果你 clone the Slick source repo 和 grep 为 def <>,你会发现 <> 是 ShapedValue 的一个方法,它返回一个 MappedProjection。
【讨论】:
implicit.*def.*: ShapedValue,看起来提供ShapedValue 的隐式来自BasicProfile。虽然我对 Slick 一点也不熟悉,而且由于您链接到的文档不包含任何导入语句,我不确定该隐式如何进入范围。您可能想提出另一个问题。