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

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

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

【问题讨论】:

    标签: scala slick


    【解决方案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 一点也不熟悉,而且由于您链接到的文档不包含任何导入语句,我不确定该隐式如何进入范围。您可能想提出另一个问题。
      猜你喜欢
      • 2010-11-28
      • 2020-05-25
      • 2018-06-12
      • 2012-10-03
      • 2011-01-20
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多