Scala`s<>操作员意义

时间:2016-04-22 20:42:38

标签: scala slick playframework-2.5

我正在尝试学习Scala,以便在Play Framework中使用它。现在我正在处理Play for Scala + Slick的数据库层,我正在使用一些我不理解的教程代码,我无法在Scala手册中找到任何信息。

这是事情。我有名为Entry的模型。它被定义为case类,我有一个从Table扩展的伴随类。

case class Entry(id: Int, name: String)

class EntryTable(tag: Tag) extends Table[Entry](tag, "entries") {
  def id = column[Int]("id", O.PrimaryKey)
  def name = column[String]("name")
  def * = (id, name) <> (Entry.tupled, Entry.unapply(_))
}

我不明白,是def *的最后一行。我知道,它与反射有关。基本上我会理解def * = (id, name)部分,但另一部分是什么意思。我找不到运算符<>的含义?任何人都可以向我解释这个吗?

1 个答案:

答案 0 :(得分:9)

运算符<>表示元组(Int, String)和案例类Entry之间的投影。

可以通过以下步骤解释:

  1. 为了返回对象,Slick需要*投影(*来自SQL中的SELECT *
  2. 可以通过各种方式定义此投影,但最常见的是使用<>运算符。简化后,它的签名如下:<>[T, C](apply: T => C, unapply: C => Option[T])
  3. (id, name)构建了一个(Int, String)的元组(简化,实际上是(Rep[Int], Rep[String]),但Slick稍后会解除它)
  4. <>将其映射到Entry,因为Entry的{​​{1}}带有签名apply,由(Int, String) => Entry转换为{{1} {}包含签名.tupled的{​​{1}}。
  5. 现在您有((Int, String)) => Entry投影,可以从数据库行和对象行构造unapply个对象。