В вашем примере, ~ используется двумя различными способами, чтобы означать две разные вещи. В первой части у вас есть
get[Pk[Long]]("sites.id") ~ // Help me parse this syntax
get[String]("sites.name") ~
get[BigDecimal]("sites.latitude") ~
и т.д. Как уже было сказано, это просто вызов метода, это то же самое, как
get[Pk[Long]]("sites.id").~(get[String]("sites.name").~(...
Вы можете посмотреть на the definition of this method in the anorm source. Это метод на RowParser[A]
(синтаксический анализатор, который разбирает A
, который принимает RowParser[B]
(синтаксический анализатор, который анализирует B
) и возвращает парсер, который разбирает A ~ B
. Это A ~ B
является вторым смыслом для ~
. Это теперь идет не к способу, но к case class defined in the same file here.
case class ~[+A, +B](_1: A, _2: B)
Это просто своеобразный способ обращения к классу ~[A,B]
. на уровне типа, когда у вас есть конструктор типа в два аргумента, вы можете использовать имя класс в инфиксной нотации. Это не что-то особенное о ~
, оно будет работать с любыми двумя конструктор типа аргумента. Если у вас есть trait Foo[A,B]
, вы можете называть это как A Foo B
. Аналогично, в сопоставлении с образцом, переменных a
и b
может быть связан с использованием синтаксиса a Foo b
, который упоминается как инфиксной операции Pattern в разделе 8.1.10 на language specification.
Во второй части вашего примера у вас есть:
case id ~ name ~ latitude ~ longitude =>
Это сопоставление с образцом на этих ~
случае clases, которые являются результатом запуска разобрана вы сконструированный выше. Так что это действительно лучший способ написать:
case ~(~(~(id, name), latitude), longitude) =>
Эта нотация была получена из комбинаторов парсеров. Пожалуйста, см. Http://stackoverflow.com/questions/6818390/understanding-the-tilde-in-scalas-parser-combinators. Короче говоря, вы можете мысленно заменить '~' на '&', поэтому такая структура будет выглядеть как шаблон (вы знаете, как шаблон в регулярном выражении). Вы определяете представление высокого уровня, используя определенные части (объединенные в сплошную структуру с ~), а затем анализируете либо succedes, и вы получаете структуру по вашей схеме, либо не удается. Например, чтобы соответствовать алгебраическому выражению, можно написать что-то вроде 'Number ~ Operation ~ Number ...' –
@ om-nom-nom Итак, почему вы ответили в комментарии? –
@ DanielC.Sobral, потому что я не уверен, что вопрос о технической реализации (который уже был объяснен gzm0) или о семантическом материале. –