我正在尝试学习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)
部分,但另一部分是什么意思。我找不到运算符<>
的含义?任何人都可以向我解释这个吗?
答案 0 :(得分:9)
运算符<>
表示元组(Int, String)
和案例类Entry
之间的投影。
可以通过以下步骤解释:
*
投影(*
来自SQL中的SELECT *
)<>
运算符。简化后,它的签名如下:<>[T, C](apply: T => C, unapply: C => Option[T])
(id, name)
构建了一个(Int, String)
的元组(简化,实际上是(Rep[Int], Rep[String])
,但Slick稍后会解除它)<>
将其映射到Entry
,因为Entry
的{{1}}带有签名apply
,由(Int, String) => Entry
转换为{{1} {}包含签名.tupled
的{{1}}。((Int, String)) => Entry
投影,可以从数据库行和对象行构造unapply
个对象。