2013-07-15 4 views
5

से शीर्ष स्तर का फ़ंक्शन कॉल करें मुझे लगता है कि इसका एक सरल उत्तर है, लेकिन मेरी वेब खोज इसे नहीं मिल सका।ग्रोवी विधि

मैं निम्नलिखित (ideone) मिल गया है, तो:

def f() {} 

class C 
{ 
    public h() { f() } 
} 

x = (new C()).h(); 

यह निम्न त्रुटि के साथ विफल:

No signature of method: c.f() is applicable for argument types:() values: [] 

मैं कैसे C की एक विधि के अंदर से f() कहते हैं?

उत्तर

6

आप एक की जरूरत है:,

def f() { println "Hello" } 

class C 
{ 
    public h() { f() } 
} 

C.metaClass.f = { f() } 

x = (new C()).h(); 
+0

प्लस @ dmahapatro के जवाब :-) – Will

+0

खैर समझाया। मैं शायद ही कभी अपने फोन से यह स्पष्टीकरण दे सकता हूं, इसलिए मैंने एक आसान प्रस्ताव दिया। ;) – dmahapatro

0

यहाँ यह करने के लिए, मेटा-प्रोग्रामिंग का उपयोग कर एक ही रास्ता है:

def f() {} 
class C {  
    def h = { f() } 
} 
x = (new C()).h 
x.delegate = this 

x() 
2

एक और तरीका है का उपयोग कर metaClass एक बंद करने और उपयोग के रूप में h() परिभाषित करने के लिए है के बिना "बाहरी" वर्ग का संदर्भ (जो वास्तव में बाहरी वर्ग नहीं है)।

मान लें कि आप Script.groovy फ़ाइल में अपना कोड लिख रहे हैं, यह दो वर्ग उत्पन्न करता है: C.class और Script.classC को f() विधि पर कॉल करने का कोई तरीका नहीं है, क्योंकि इसे पता नहीं है कि यह कहां परिभाषित किया गया है।

आप कुछ विकल्प हैं:

1) @ MichaelEaster के विचार, वर्तमान क्षेत्र (यानी Script)

2) से एक metaclass defition देने बनाएं/C अंदर एक Script वस्तु पारित:

def f() { "f" } 

class C 
{ 
    public h(s = new Script()) { s.f() } 
} 

assert "f" == new C().h() 

3) बनाओ ०१२३९६८०७४७एक आंतरिक वर्ग (जो भी Script का एक उदाहरण की जरूरत है:

class Script { 
    def f() { "f" } 

    class C 
    { 
     public h() { f() } 
    } 

    static main(args) { 
    assert "f" == new C(new Script()).h() 
    } 
} 

4) स्टेटिक भीतरी वर्ग के साथ साथ स्थिर f():

class Script { 
    static def f() { "f" } 

    static class C 
    { 
     public h() { f() } 
    } 

    static main(args) { 
    assert "f" == new C().h() 
    } 
}