在stringtemplate v4中实现自定义函数

时间:2014-02-08 19:09:45

标签: java stringtemplate stringtemplate-4

在StringTemplate v3中,我们有一个自定义Java HashMap实现,它将调用提供的键上的函数并返回函数结果,而不是执行实际的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函数并让它返回一个值给模板,字符串参数是一个表达式,可以访问封闭范围的属性。

1 个答案:

答案 0 :(得分:1)

您可以在模板周围使用“to string”运算符(...)

$somearray:{ v |
  $myfunc.(({value: $v$}))$
}$