14

你好freemarkers大师

我知道freemarker函数和宏之间的区别在于宏可以打印到输出,但不能返回值,而函数可以返回值但不能打印到输出。

好吧,我遇到了问题,因为我需要打印和返回值:

我正在使用 freemarker 进行递归树探索,因此我有一个被递归调用的宏。在探索树时,我既需要将节点信息打印到输出,还需要计算并返回有关所探索节点的统计信息(例如所探索节点的特定属性的总和)

如果我使用递归调用宏,我可以打印节点信息,但不能将统计信息返回给调用实体。

如果我使用递归调用的函数,我可以返回统计信息,但不能在输出中打印节点信息。

一种解决方案可能是探索树两次,一次打印节点信息,另一次收集统计信息,但我讨厌使用这种不雅的解决方案。

有人可以提出更好的解决方案吗?

谢谢

4

2 回答 2

2

或者您甚至可以使用全局变量作为统计数据的存储:

<#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>
于 2015-08-11T13:05:41.143 回答
1

您可以将统计信息存储在非#local变量中。就像您在宏中所做的那样<#assign treeStats = ...>,然后在呼叫站点上:

<#import my="myutils.ftl">
...
<@my.tree input />
<#assign stats = my.treeStats /> <#-- or whatever you want with my.treeStats -->

是的,这很尴尬,但 FreeMarker 没有返回辅助结果的输出参数。实际上,您可以使用循环变量进行 hack,但这可能太令人困惑,而且如果您真的需要一个主体,则不能使用此技巧:

<@my.tree input; res><#assign stats = res></@>
于 2012-08-08T10:32:58.840 回答