В StringTemplate v3 у нас была специальная реализация Java HashMap, которая вызывала функцию по предоставленному ключу и возвращала результат функции вместо того, чтобы выполнять фактический поиск по хэш-карте. Мы бы добавили экземпляр этого HashMap в качестве атрибута в stringtemplate. Это позволит нам писать собственные функции в StringTemplate. Мы бы назвали это так:
$myfunc.("argument")$
и
$somearray:{ v |
$myfunc.("value: " + v)$
}$
Myfunc HashMap здесь получит ключ типа String
Конкатентация с + больше невозможна в v4, и предлагаемое изменение состоит в том, чтобы сделать "value" + v анонимным шаблоном:
$somearray:{ v |
$myfunc.({value: $v$})$
}$
В этом случае объект ST передается в HashMap, и я могу вызвать на нем 'render ()', чтобы сгенерировать текст, который я обычно получаю, НО: атрибут 'v' больше не передается из окружающей области. Как я могу, учитывая объект ST, найти окружающую область видимости (ST), чтобы я мог скопировать атрибуты и выполнить эту работу?
Я действительно не хочу менять свой код на
$somearray:{ v |
$myfunc.((v:{ v | value: $v$}))$
}$
потому что у нас большая кодовая база, и это очень разрушительное изменение.
Есть ли другой способ достичь того, чего я хочу здесь? Я действительно пытаюсь вызвать функцию Java со строковым аргументом и заставить ее вернуть значение в шаблон, причем строковый аргумент является выражением, которое может получить доступ к атрибутам охватывающих областей.