Несколько групп параметров в шаблонах Twirl

Я только начинаю изучать шаблоны Twirl как часть платформы Play, и мне было интересно, сможет ли кто-нибудь лучше объяснить семантику нескольких групп параметров в шаблоне.

Я понимаю, что один набор параметров (обычно первый?) — это те, которые я должен предоставить сам. Я также заметил, что любые неявные параметры перечислены последними.

Это вторая группа параметров, которая в случае моего руководства говорит (content: Html), где я не уверен, как она используется.

Прямо сейчас я полагаю, что этот Twirl проходит три этапа частичного применения параметров: пользовательский, внутренний и неявный. Я мог бы быть далеко на этом, хотя, кто-то меня прямо!


person Alexander Trauzzi    schedule 31.08.2014    source источник


Ответы (1)


Напомним, что шаблон Twirl компилируется в функцию Scala. Функции Scala могут иметь несколько групп параметров, так же как и шаблоны Twirl. На самом деле это просто синтаксический сахар, чтобы сделать передачу аргументов более приемлемой для анонимных функций. Например:

scala> def foo(a:String, b: () => String) = { a + b() }
foo: (a: String, b: () => String)String

scala> foo("hello", { () => " there" } )
res2: String = hello there

scala> def foo(a:String)( b: () => String) = { a + b() }
foo: (a: String)(b: () => String)String

scala> foo("hello") { () => " there" }
res3: String = hello there

Как видите, результаты те же, но синтаксис вызова во втором случае "приятнее".

Обычно имплициты помещаются в последнюю группу, потому что тогда их вообще не нужно указывать.

Итак, если у вас есть шаблон views.html.foo с такой строкой заголовка:

@(title: String)(content: Html)

Это просто облегчает вам вызов его с помощью чего-то вроде:

Ok(views.html.foo("Title") { /* generate some html */ } )

Вы сказали:

Я полагаю, что этот Twirl проходит три этапа частичного применения параметров: пользовательский, внутренний и неявный. Я мог бы быть далеко на этом, хотя, кто-то меня прямо!

Да, вы далеки от этого. :) Аргументы оцениваются группами, но все до того, как произойдет вызов сгенерированной Twirl функции. Просто подумайте об этом как о синтаксическом сахаре, как указано выше.

person Reid Spencer    schedule 24.10.2014