Реализуйте пользовательские функции в строковом шаблоне v4

В 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 со строковым аргументом и заставить ее вернуть значение в шаблон, причем строковый аргумент является выражением, которое может получить доступ к атрибутам охватывающих областей.


person user3286045    schedule 08.02.2014    source источник


Ответы (1)


В шаблоне можно использовать оператор (...) для вставки в строку:

$somearray:{ v |
  $myfunc.(({value: $v$}))$
}$
person Sam Harwell    schedule 08.02.2014