2012-08-08 4 views
9

안녕하세요 freemarkers 지도자프리 마커 기능 대 매크로

나는 프리 마커 기능 및 매크로의 차이점은 함수 값을 반환 할 수 있지만 출력에 인쇄 할 수 있지만 매크로, 출력에 인쇄 할 수 있지만 값을 반환 할 수 없다는 것을 이해

. 나는 프리 마커와 재귀 트리 탐사를하고있는 중이 야

때문에 나는 매크로 recurvively 호출되는이 : 나는 모두 인쇄하고 값을 반환해야하기 때문에

글쎄, 나는 문제가 있습니다. 트리를 탐색 할 때 출력에 노드 정보를 출력하고 탐색 된 노드에 대한 통계를 계산하고 반환해야합니다 (예 : 탐색 노드의 특정 속성 합계)

매크로를 사용하는 경우 recurvively 호출되는 노드 정보를 인쇄 할 수 있지만 호출하는 엔터티에 통계를 반환 할 수 없습니다.

재귀 적으로 호출 된 함수를 사용하면 통계를 반환 할 수는 있지만 출력에 노드 정보를 인쇄 할 수 없습니다.

하나의 솔루션은 트리를 두 번 탐색 할 수 있습니다. 한 번 노드 정보를 인쇄하고 다른 노드는 통계를 수집하는 것이지만, 나는이 비범 한 해결책을 사용하는 것을 싫어합니다.

누군가가 더 나은 해결책을 제안 할 수 있습니까?

감사

답변

0

당신은 비 #local 변수에 통계를 저장할 수 있습니다. 매크로에서와 마찬가지로 당신은 전화-사이트에 다음 <#assign treeStats = ...>을하고 :

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

그래, 어색하지만 프리 마커는 차 결과를 반환 할 아웃 PARAMS이 없습니다. 사실, 당신은 루프 변수 해킹을 할 수 있지만, 어쩌면 너무 혼란, 플러스 당신이 정말로 몸을 필요로하는 경우,이 트릭을 사용할 수 없습니다

<@my.tree input; res><#assign stats = res></@> 
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> 
관련 문제