2012-08-10 11 views
5

मैं ग्रोवी के लिए नया हूं और मैं कुछ विशिष्ट कार्य के लिए एक मिनी डीएसएल लिखने की कोशिश कर रहा हूं। इस प्रयोजन के लिए मैं इस नीचे की तरह एक समस्या को हल करने की कोशिश कर रहा है: मैं (parantheses का उपयोग किए बिना) के लिए इस कोड को फोन करके मुद्रित करने के लिए (और/या वापसी) 5 चाहते हैं:ग्रोवी के साथ डीएसएल -> पास पैरामीटर मान

give me 5 

मैं उम्मीद कि नीचे इस तरह की परिभाषा काम करेगी:

def give = {clos -> return clos} 
def me = {clos -> println clos; return clos} 

लेकिन वास्तव में यह नहीं करता है। क्या आप कृपया मुझे "मुझे" 5 "अभिव्यक्ति के साथ मूल्य 5 वापस करने के लिए" देने "और" मुझे "परिभाषित करने में मदद कर सकते हैं, जहां मुझे बंद होना चाहिए, भी मेटा क्लास, संपत्ति इत्यादि दे सकता है।

अग्रिम धन्यवाद! आईवी

उत्तर

3

ग्रूवी 1.8+

give me 5 

लेता है और पार्सर को प्रभावी ढंग से करने की कोशिश करता:

give(me).5 

तो, अगर आप इस तरह अपने कोड लिखने, यह काम करता है:

def give = { map -> map } 
def me = [:].withDefault { it } 

a = give me 5 

println a 

प्रिंट:

5 
+0

धन्यवाद! यही वही है जो मैं ढूंढ रहा था। क्या आप किसी ऐसे स्थान का संदर्भ दे सकते हैं जहां मैं [:] के साथ डीफॉल्ट निर्माण के बारे में अधिक पढ़ सकता हूं? – ivita

+0

@ivita कोई चिंता नहीं! यह परिभाषित किया गया है [यहां] (http://groovy.codehaus.org/groovy-jdk/java/util/Map.html#withDefault%28groovy.lang.Closure%29)।एक बात यह जानना है कि '5' 'यह प्रिंटिंग है वास्तव में एक स्ट्रिंग है, न कि' इंटीजर '। ऐसा इसलिए है क्योंकि यह संपत्ति नाम (स्ट्रिंग) के रूप में '5' प्राप्त करने का प्रयास करता है, इसलिए स्ट्रिंग को भी –

+0

देता है मुझे इसे स्ट्रिंग के रूप में चाहिए :-) धन्यवाद! – ivita

1

आपके बंद होने सही हैं। ब्रेसेस गुम हैं। यदि आप पूरी तरह से, ब्रेसिज़ को खत्म इतनी के रूप में जाने के लिए पार्सर समझ में बिल्कुल पारित किया जा करने की जरूरत है एक चर के कुछ भागों में निर्दिष्ट करना इस

give(me(5)) or 
give me(5) 

वरना कोशिश करो।

five = me 5 
give five 
+0

धन्यवाद, यह काम करता है, लेकिन मैं यह उल्लेख करना भूल गया कि मैं अपने नियमों को बिना किसी ब्रांड्स के काम करना चाहता हूं। क्या आपको कोई विचार है कि ऐसा कैसे करें? – ivita

-1

आपकी विधि क्या है?

give me 5 

मुझे हो आप, आप आवश्यकता होगी सकता है हैं:: आप एक वाक्यात्मक आवश्यकता लिखा है

give("me", 5) 
give "me", 5 //equivalent "DSL" notation 
give("you", 7) 
give "you", 7 //equivalent "DSL" notation 

//or... 
def me= "Mickey", you= "Donald" 
give(me, 5) 
give me, 5 //equivalent "DSL" notation 
give(you, 7) 
give you, 7 //equivalent "DSL" notation 

मुझे कभी नहीं बदलता, तो अर्थ विज्ञान के सबसे करीब है प्रति:

giveMe(5) 
giveMe 5 //equivalent "DSL" notation 

आपने लिखा है "मुझे एक बंद होना चाहिए "और" मैं चाहता हूं कि मेरे नियम सिंटैक्टिक बाधाओं से शुरू हो जाएं "। हमेशा अर्थपूर्ण आवश्यकताओं से शुरू करें :-)

संबंधित मुद्दे