14

こんにちはフリーマーカーの達人

freemarker 関数とマクロの違いは、マクロは出力に出力できますが、値を返すことはできませんが、関数は値を返すことができますが、出力に出力できないことです。

さて、値を出力して返す必要があるため、問題が発生しています。

freemarker を使用して再帰的なツリー探索を行っているため、再帰的に呼び出されるマクロがあります。ツリーが探索されているため、ノード情報を出力に出力するだけでなく、探索されたノードに関する統計を計算して返す必要があります (探索されたノードの特定のプロパティの合計など)。

再帰的に呼び出されるマクロを使用すると、ノード情報を出力できますが、呼び出しエンティティに統計を返すことはできません。

再帰的に呼び出される関数を使用すると、統計を返すことはできますが、出力にノード情報を出力することはできません。

解決策の 1 つは、ツリーを 2 回探索することです。1 回目はノード情報を出力し、もう 1 回目は統計を収集します。

誰かがより良い解決策を提案できますか?

ありがとう

4

2 に答える 2

1

統計は非#local変数に保存できます。マクロの場合と同様に、<#assign treeStats = ...>呼び出しサイトで実行します。

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

ええ、それは厄介ですが、FreeMarkerには二次的な結果を返すためのout-paramsがありません。実際には、ループ変数を使用してハックを行うことはできますが、混乱しすぎる可能性があります。さらに、本当にボディが必要な場合は、このトリックを使用できません。

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