Я использую шаблонный движок Groovy без проблем около года, но столкнулся со странной проблемой, и я не уверен, что сошел с ума, или это ожидаемое поведение.
ВсеПри прочих равных условиях использование этой функции приводит к ошибке компиляции при использовании внутри шаблона Groovy.
def isEven(n) { n % 2 == 0 }
Общая ошибка при генерации класса: org.codehaus.groovy.ast.Parameter не может быть приведен к org.codehaus.groovy.ast.expr.VariableExpression
Но если я делаю это таким образом ...
def isEven(n) { n.mod(2) == 0 }
... все работает, как ожидалось.
Я не заметил каких-либо особых случаев в документах, но я мог пропустить это. Может ли кто-нибудь дать некоторое представление о значении этой ошибки и, возможно, предложить руководство, чтобы избежать подобных ошибок в будущем?
Приветствия, и спасибо!
Groovy версия 2.5
Обновление Вот полный пример шаблона, который выдает ошибку.
def isEven(n) { n % 2 == 0 }
def items = ["Zero", "One", "Two"]
yieldUnescaped '<!DOCTYPE html>'
html(lang:'en') {
body {
ul {
items.eachWithIndex { item, i ->
if(isEven(i)) li(item)
}
}
}
}
А вот пример того, как шаблон отображается.
TemplateConfiguration config = new TemplateConfiguration();
MarkupTemplateEngine engine = new MarkupTemplateEngine(config);
Template template = engine.createTemplate(new File('test.tpl').newReader());
Map<String, Object> model = new HashMap<>();
Writable output = template.make(model);
output.writeTo(new File('test.html').newWriter());
Изменение метода isEven для использования Number.mod очень хорошо компилируется.