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