2012-08-08 21 views
9

हैलो freemarkers गुरुfreemarker कार्यों बनाम मैक्रो

मैं समझता हूँ कि freemarker कार्यों और मैक्रोज़ के बीच अंतर यह है कि मैक्रो उत्पादन के लिए मुद्रित कर सकते हैं, लेकिन मान नहीं कर सकते, कार्यों मान सकते हैं, जबकि लेकिन उत्पादन के लिए मुद्रित नहीं कर सकते है।

ठीक है, मैं एक समस्या हो रहा है, क्योंकि मैं दोनों प्रिंट और मान की जरूरत है:

मैं freemarker साथ पुनरावर्ती पेड़ अन्वेषण कर रहा हूँ और इसलिए मैं एक मैक्रो recurvively बुलाया जा रहा है। जैसा कि पेड़ की खोज की जा रही है, मुझे आउटपुट में नोड जानकारी मुद्रित करने की आवश्यकता है, लेकिन नोड्स के अन्वेषण के बारे में आंकड़ों की गणना और वापसी भी करें (उदाहरण के लिए नोड्स की एक विशिष्ट संपत्ति का योग)

यदि मैक्रो का उपयोग करता हूं पुनरावर्तक कहा जा रहा है मैं नोड जानकारी मुद्रित कर सकता हूं लेकिन आंकड़े कॉलिंग इकाई को वापस नहीं कर सकता।

यदि मैं दोबारा फ़ंक्शन का उपयोग करता हूं, तो मैं आंकड़े वापस कर सकता हूं लेकिन आउटपुट पर नोड जानकारी मुद्रित नहीं कर सकता।

एक समाधान दो बार पेड़ का पता लगाने के लिए हो सकता है, एक बार नोड सूचनाओं को प्रिंट करने के लिए और दूसरे आंकड़ों को इकट्ठा करने के लिए, लेकिन मैं इस अजीब समाधान का उपयोग करने से नफरत करता हूं।

क्या कोई बेहतर समाधान का प्रस्ताव दे सकता है?

धन्यवाद

उत्तर

0

आप एक गैर #local चर में आंकड़े स्टोर कर सकते हैं। मैक्रो में की तरह आप कॉल-साइट पर <#assign treeStats = ...> और फिर:

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

हाँ, यह अजीब है, लेकिन FreeMarker कोई बाहर पैरामीटर एक माध्यमिक परिणाम वापस जाने के लिए है। असल में, आप पाश-चर के साथ एक हैक कर सकता है, लेकिन यह शायद बहुत भ्रामक है, के साथ साथ यदि आप वास्तव में एक शरीर की जरूरत है, तो आप इस चाल का उपयोग नहीं कर सकते हैं:

<@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> 
संबंधित मुद्दे