5

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

事情就是这样。我有一个名为 Entry 的模型。它被定义为案例类,我有一个从 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),但另一部分是什么意思。我找不到运算符的含义<>?谁能给我解释一下?

4

1 回答 1

9

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

可以分步骤解释:

  1. 为了返回对象,Slick 需要一个*投影(*来自SELECT *SQL)
  2. 可以通过多种方式定义此投影,但最常见的是使用<>运算符。它的签名,简化后看起来像:<>[T, C](apply: T => C, unapply: C => Option[T])
  3. (id, name)构造一个(Int, String)(简化的,实际上是(Rep[Int], Rep[String]),但 Slick 稍后会取消它)的元组
  4. <>将其映射到Entry,因为Entryhas applywith signature(Int, String) => Entry.tupledto((Int, String)) => Entryunapplywith signature转换Entry => Option[(Int, String)]
  5. 现在您有了可以从数据库行和对象行*构造对象的投影。Entry
于 2016-04-22T21:11:16.330 回答