Hello freemarkers gurus
据我所知,freemarker函数和宏之间的区别在于宏可以打印到输出,但不能返回值,而函数可以返回值但不能打印到输出。
好吧,我遇到了问题,因为我需要打印并返回值:
我正在使用freemarker进行递归树探索,因此我有一个宏被称为recurvively。在正在探索树时,我既需要将节点信息打印到输出,也需要计算和返回有关所探索节点的统计信息(例如,探索的节点的特定属性的总和)
如果我使用recurvively调用宏,我可以打印节点信息但不能将统计信息返回给调用实体。
如果我使用递归调用的函数,我可以返回统计信息,但不能在输出上打印节点信息。
一种解决方案可能是两次探索树,一次打印节点信息,另一种收集统计数据,但我不愿意使用这种不太优雅的解决方案。
有人可以提出更好的解决方案吗?
由于
答案 0 :(得分:1)
或者您甚至可以使用全局变量作为统计信息的存储空间:
<#global stats = [] />
<#-- then when you call your function -->
<#assign = method() />
<#function method param = "">
<#-- do something and before you return you push the stats to the global variable, if you choose my approach of "merging" sequences, be careful that you wrap the new stats item also in a sequence or it will fail miserably =) -->
<#global stats = stats + [{"statvar1": 10, "statvar2": 30}] />
<#return whateveryoulike />
</#function>
答案 1 :(得分:0)
您可以将统计信息存储在非#local
变量中。就像在宏中一样,您执行<#assign treeStats = ...>
,然后在call-site:
<#import my="myutils.ftl">
...
<@my.tree input />
<#assign stats = my.treeStats /> <#-- or whatever you want with my.treeStats -->
是的,这很尴尬,但FreeMarker没有out-params来返回次要结果。实际上,你可以用循环变量做一个hack,但它可能太混乱了,再加上如果你真的需要一个体,你就不能使用这个技巧:
<@my.tree input; res><#assign stats = res></@>