2012-04-26 4 views
6

ग्रूवी कुछ बहुत ही अप्रिय "ग्रूवी बीन्स" और संवृति है कि यह कुछ निश्चित परिस्थितियों में स्थानीय चर मुखौटा हो सकता है के साथ जुड़े व्यवहार करने लगता है।स्वत: संपत्ति गेटटर, स्थानीय चर, और बंद के बीच ग्रोवी संघर्ष?

इस नाम से जाना जाता व्यवहार है और वहाँ कुछ प्रलेखन कहीं इस सामग्री का विवरण है?

class TestClass { 

    def doIt(Closure closure) { 
     closure.setDelegate(this) 
     closure.call() 
    } 

    def getRevision() { 
     return "testclass revision" 
    } 
} 

def testIt() { 
    def revision = "testit revision" 

    println "1: " + revision + " (expect: testit)" 

    TestClass tester = new TestClass() 
    tester.doIt { 
     println "2: " + getRevision() + " (expect: testclass)" 
    } 

    println "3: " + revision + " (expect: testit)" 

    tester.doIt { 
     println "4: " + revision + " (expect: testit)" 
     revision = getRevision() 
     println "5: " + revision + " (expect: testclass)" 
     println "6: ${getRevision()} (expect: testclass)" 
     println "7: " + getRevision() + " (expect: testclass)" 
    } 

    // expect to have been set to testclass value in previous closure 
    println "8: " + revision + " (expect: testclass)" 

    tester.doIt { 
     println "9: ${getRevision()} (expect: testclass)" 
     println "10: " + getRevision() + " (expect: testclass)" 
    } 

    println "11: " + revision + " (expect: testclass)" 
} 

testIt() 

इस कोड रनिंग निम्नलिखित उत्पादन का उत्पादन: मैं क्या काम कर रहा था पता लगाने की कोशिश में बहुत समय ...

निम्नलिखित कोड पर विचार करें बर्बाद

1: testit revision (expect: testit) 
2: testclass revision (expect: testclass) 
3: testit revision (expect: testit) 
4: testit revision (expect: testit) 
5: testit revision (expect: testclass) 
6: testit revision (expect: testclass) 
7: testit revision (expect: testclass) 
8: testit revision (expect: testclass) 
9: testclass revision (expect: testclass) 
10: testclass revision (expect: testclass) 
11: testit revision (expect: testclass) 

मेरे मुख्य समस्या 5/6/7 के साथ है। ऐसा लगता है कि बस बंद करने के भीतर स्थानीय revision चर का उपयोग कर "खाल" प्रतिनिधि में getRevision() विधि और के साथ यह बदल देता है एक सेम शैली स्वत: जनरेट getRevision()revision "संपत्ति" मैच के लिए। अगर मैं revision चर का उपयोग नहीं करता, तो getRevision() पर कॉल करें इस बीन व्यवहार को नकारें।

प्रलेखन के लिए किसी भी जानकारी या लिंक की सराहना की होगी!

उत्तर

1

ग्रूवी बंद have a resolveStrategy property कि संकल्प के क्रम को नियंत्रित किया जा सकता है। डिफ़ॉल्ट रणनीति "स्वामित्व" ऑब्जेक्ट से संपत्ति को देखना है और केवल तभी प्रतिनिधि को उपयोग करने के लिए नहीं मिल सकता है। मेरा मानना ​​है कि इसे DELEGATE_FIRST पर सेट करने से आप जिस व्यवहार की अपेक्षा कर रहे हैं उसे प्राप्त करेंगे।

+0

उत्तर के लिए धन्यवाद। मैंने आपके सुझाव की कोशिश की लेकिन दुर्भाग्य से यह मदद नहीं की। मुझे लगता है कि समस्या यहाँ संकलन समय पर है: दोनों 'revision' और' getRevision का उपयोग कर() 'बंद भीतर ग्रूवी संकलक बनाता है यह' revision' चर, जो तब प्रतिनिधि के संस्करण खाल के लिए एक गेटर उत्पन्न करने के लिए है लगता है। –

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