2016-04-22 1 views
5

Я пытаюсь изучить Scala, чтобы использовать его в Play Framework. Теперь я имею дело с Play for Scala + Slick для уровня базы данных, и я использую кусок кода из учебника, который я не понимаю, и я не могу найти какую-либо информацию в руководстве Scala.Scala`s <> операторский смысл

Вот что. У меня есть модель с именем Entry. Он определяется как класс case, и у меня есть класс компаньонов, расширенный из таблицы.

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), но что значит другая часть. Я не могу найти смысл оператора <>? Кто-нибудь может мне это объяснить?

ответ

9

Оператор <> означает проекцию между кортежем (Int, String) и классом корпуса Entry.

Это может быть объяснено в шагах:

  1. Для того чтобы вернуть объекты, сликовый нуждается в * проекции (* составляет от SELECT * в SQL)
  2. Эта проекция может быть определена различными способами, но Наиболее распространенным является использование оператора <>. Это подпись, когда упрощена, выглядит следующим образом: <>[T, C](apply: T => C, unapply: C => Option[T])
  3. (id, name) создает кортеж из (Int, String) (упрощенный, на самом деле это (Rep[Int], Rep[String]), но Slick будет unlift позже)
  4. <> отображает его Entry, потому что Entry имеет apply с подписью (Int, String) => Entry, который преобразован в .tupled на номер ((Int, String)) => Entry и unapply с подписью Entry => Option[(Int, String)].
  5. Теперь у вас есть проекция *, которая может содержать объекты Entry объектов из строк базы данных и строк из объектов.
+0

Спасибо за ответ! Теперь это выглядит довольно ясно. – spidla

+0

Обратите внимание, что это не стандартная вещь scala, это всего лишь метод с причудливым именем, добавленным пятном. –

Смежные вопросы