2010-11-24 13 views
5

मैं हस्ताक्षरएक रिकर्सिव फ़ंक्शन में समान मान को पास करना?

public static string Recurse(string pattern, ObjectDict dict) 

dict का मूल्य कभी नहीं बदलता साथ एक पुनरावर्ती समारोह मिल गया है। यह मुझे परेशान करता है कि मुझे इसके दर्जनों संदर्भों को ले जाना चाहिए, और जब भी मैं फ़ंक्शन को दोबारा कॉल करता हूं, इसे चारों ओर पास करना पड़ता है। क्या इसके चारों ओर एक रास्ता है?

"कभी नहीं बदलता" से, मेरा मतलब प्रारंभिक कॉल के बाद है।

उत्तर

10

संदर्भ बेहद हल्के हैं, इसलिए इसके बारे में चिंता न करें।

तुम सच में यह से बचने के लिए (और, मैं तुम्हें ऐसा नहीं लगता कि), कुछ इस तरह विचार करना की जरूरत है:

class MyClass 
{ 
    private ObjectDict m_dict; 

    public string Recurse(string pattern, ObjectDict dict) 
    { 
     m_dict = dict; 
     return HelperRecurse(pattern); 
    } 

    private string HelperRecurse(string pattern) 
    { 
     // do some work. (referring to m_dict) 
     HelperRecurse(pattern); // Go recursive 

     return "Hello World"; 
    } 
} 

ऐसा करने से, आप नहीं रह गया है के लिए संदर्भ के आसपास गुजर रहे हैं एक ही शब्दकोश, बस हमेशा सदस्य-वस्तु तक पहुंचता है। हालांकि, अब आपने अपने फ़ंक्शन की static प्रकृति खो दी है।

+1

+1 संक्षिप्तता के लिए इसे पारित करने के बिना dict वस्तु के लिए उपयोग होगा! –

1

खैर, स्पष्ट विकल्प RecurseObjectDict पर एक उदाहरण विधि बनाना है यदि आप कर सकते हैं। फिर आप आंतरिक रूप से Recurse(pattern) पर कॉल कर सकते हैं।

यदि किसी भी कारण से संभव नहीं है, तो इसे पसीना न करें। वास्तव में, दो विकल्प वास्तव में बहुत समान हैं - उदाहरण के तरीकों के लिए, प्रभावी रूप से एक अदृश्य "यह" पैरामीटर है जो शेष पैरामीटर से पहले, पहले के साथ पारित किया जाता है। आप बस दूसरे छोर पर अपनाए हैं :)

+0

'ऑब्जेक्टडिक्ट' सिर्फ 'शब्दकोश <स्ट्रिंग, ऑब्जेक्ट>' है क्योंकि मैं हर जगह टाइप करने के लिए बहुत आलसी हूं :) – mpen

2

एक विकल्प Recurse फ़ंक्शन के वास्तविक तर्क को पकड़ने के लिए लैम्ब्डा अभिव्यक्ति का उपयोग करना है। यह तो रिकर्सिवली कहा जा सकता है और क्योंकि यह एक लैम्ब्डा है उसके चारों ओर

public static string Recurse(string initialPattern, ObjectDict dict) { 
    Func<string, string> inner = null; 
    inner = pattern => { 
    // Logic which uses calls to inner for recursion. Has access to dict 
    // because it's a lambda. For example 
    if (dict.SomeOperation()) { 
     return inner(someOtherPattern); 
    } 
    return aValue; 
    }; 
    return inner(initialPattern); 
} 
+0

हां ... हाल ही में लैम्बडास उपयोगी होने पर एक सवाल था, और मैंने सोचा कि वे चाहते हैं कभी भी उपयोगी न हो जब तक किसी फ़ंक्शन के पैरामीटर के रूप में उपयोग न किया जाए ... निश्चित रूप से मुझे दिखाया गया है: पी इसे इस तरह से कर सकता है। धन्यवाद: डी – mpen

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