2009-05-28 12 views
5

में है कि विधि का उपयोग कर रहा "खराब" प्लस विधि ग्रूवी में निम्नलिखित तरीके से चाहते हैं ग्रूवी में methed का व्यवहार बदलने के लिए कैसे:metaclass

Integer.metaClass.plus {Integer n -> delegate + n + 1} 
assert 2+2 == 5 

मैं StackOverflowException हो रही है (जो आश्चर्य की बात नहीं है) ।

मेटाक्लास 'बंद करने के अंदर "मूल" प्लस विधि का उपयोग करने का कोई तरीका है?

उत्तर

7

ग्रूवी मुहावरेदार तरीका पुराना तरीका के लिए एक संदर्भ बचाने के लिए और नया एक के अंदर यह आह्वान करने के लिए है।

def oldPlus = Integer.metaClass.getMetaMethod("plus", [Integer] as Class[]) 

Integer.metaClass.plus = { Integer n -> 
    return oldPlus.invoke(oldPlus.invoke(delegate, n), 1)   
} 

assert 5 == 2 + 2 

यह वास्तव में है कि अच्छी तरह से प्रलेखित है और मैं या तो आज रात या कल इस सटीक विषय के बारे में एक ब्लॉग पोस्ट डाल :) पर योजना बना रहा था नहीं है।

1

उपयोग इस "खराब" करने के लिए प्लस विधि:

Integer.metaClass.plus {Integer n -> delegate - (-n) - (-1)} 
assert 2+2 == 5 

आश्चर्य नहीं कि का उपयोग करते हुए '+' प्लस विधि ओवरलोडिंग StackOverflow का परिणाम देगा में ऑपरेटर, यह कुछ अन्य तो '+' ऑपरेटर का उपयोग करने के लिए आवश्यक है।

अन्य तंत्र: एक्सओआर या कुछ बिट ऑपरेटर जादू का प्रयोग करें।

सादर, Peacefulfire

+0

ऐसा लगता है कि ग्रूवी 1.6 पर्याप्त चतुर कॉल प्रतिनिधि बदलने के लिए है - मैं ग्रूवी में भाग गया है कि + n को सौंपने के लिए (-n) और StackOverflowException अभी भी फेंक दिया जाता है –

+0

हम्म .. मेरे संस्करण ग्रूवी 1.6 है और जावा 1.5.0_15 कंसोल और यह किसी भी StackOverflowException फेंकने के बिना ठीक चला गया मैं groovyshell में भाग गया और यह ठीक चला गया। आप ऊपर लिपि चलाने की कोशिश कैसे कर रहे हैं? –

+0

बस टेड द्वारा ऊपर पोस्ट उत्तर देखा। मुझे लगता है कि यह बहुत बेहतर और सामान्य समाधान है। टेड करने के लिए +1। –

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