<> 运算符在 Slick 中的作用是啥?

Posted

技术标签:

【中文标题】<> 运算符在 Slick 中的作用是啥?【英文标题】:What does the <> operator do in Slick?<> 运算符在 Slick 中的作用是什么? 【发布时间】:2016-06-20 19:40:00 【问题描述】:

我正在通过documentation of Slick 设置一个快速工作的原型。

在“映射表”部分中,我在提到的示例中看到了 &lt;&gt; 运算符,但在任何地方都找不到任何文档。需要帮助来理解这一点。

【问题讨论】:

【参考方案1】:

&lt;&gt; 运算符定义了Table 中的Rowcase class 之间的关系。

case class User(id: Option[Int], first: String, last: String)

ROW            |id             | first        | last        |

因此,数据首先从表中取出为n-tuple&lt;&gt; 的左侧),然后转换为case class&lt;&gt; 的右侧)。

要使案例类的转换工作,需要两种方法:

Rown-tuplecase class

scala> User.tupled
res6: ((Option[Int], String, String)) => User = <function1>

所以当给定一个三元组(Option[Int], String, String) 作为参数时,这个函数可以创建一个User

case classn-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 &lt;&gt;,你会发现 &lt;&gt;ShapedValue 的一个方法,它返回一个 MappedProjection

【讨论】:

是的,检查代码有很大帮助。我对 Scala 仍然很陌生,因此经常对明显的事情产生怀疑。 :D 谢谢! 所以我看到在元组上调用了 方法。 scala 如何解析 ShapedValue 对象上的方法?我认为它是通过隐式转换完成的,但无法弄清楚。如果我需要提出另一个问题,请告诉我。 搜索正则表达式implicit.*def.*: ShapedValue,看起来提供ShapedValue 的隐式来自BasicProfile。虽然我对 Slick 一点也不熟悉,而且由于您链接到的文档不包含任何导入语句,我不确定该隐式如何进入范围。您可能想提出另一个问题。

以上是关于<> 运算符在 Slick 中的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的类型错误:$(...).slick 不是函数

`<` 运算符在 shell 中的作用是啥?

Java 中的箭头运算符“->”有啥作用?

Srcset 在 React react-slick carousel 中不起作用

Vuejs如何在子组件中使用Vue-slick?

更改“光滑”滑块中的箭头按钮