2012-08-02 54 views
6

क्या फ़ंक्शन के चारों ओर एक रैपर बनाना संभव है जिसमें मूल फ़ंक्शन के समान नाम है?उसी नाम के नए फ़ंक्शन के साथ पहले से मौजूद फ़ंक्शन को कैसे लपेटें

यह परिस्थितियों में जहां उपयोगकर्ता इनपुट चर पर कुछ अतिरिक्त जांच करने के लिए इससे पहले कि वे समारोह How to interrupt MATLAB IDE when it hangs on displaying very large array?

+0

मैं आपके द्वारा अन्य प्रश्न पर पोस्ट किए गए उत्तर से सहमत हूं (http://stackoverflow.com/questions/11779511/how-to-interrupt-matlab-ide-when-it-hangs-on-displaying-very-large- सरणी) उस प्रश्न स्लैटन के लिए अच्छा है, लेकिन सामान्य प्रश्न का एक बेहतर उत्तर है - नीचे देखें। – jmetz

उत्तर

11

वास्तव में वैकल्पिक रूप से Slayton करने के आप की जरूरत नहीं है का जवाब openvar का उपयोग करें। यदि आप एक मैटलैब फ़ंक्शन के समान नाम वाले फ़ंक्शन को परिभाषित करते हैं, तो वह उस फ़ंक्शन को छाया देगा (यानी इसके बजाए बुलाया जाएगा)।

फिर अपने स्वयं के फ़ंक्शन को दोबारा कॉल करने से बचने के लिए, आप builtin का उपयोग करके मूल फ़ंक्शन को रैपर के भीतर से कॉल कर सकते हैं।

उदा।

outputs = builtin(funcname, inputs..); 

सरल उदाहरण, rand.m और matlab पथ में नाम:

function out = main(varargin) 
disp('Test wrapping rand... calling rand now...'); 
out = builtin('rand', varargin{:}); 

नोट कि कार्यों के लिए यह केवल काम करता है builtin से पाए जाते हैं कि। जो लोग नहीं हैं, उनके लिए स्लेटन का दृष्टिकोण आवश्यक है।

+0

लेकिन ऐसे कई फ़ंक्शन हैं जो 'अंतर्निहित' नहीं हैं और मैं उन सभी को लपेटना चाहता हूं! –

+0

@ गुनथरस्ट्रूफ: आप उन सभी को क्यों लपेटना चाहते हैं ... विशेष रूप से गैर-निर्मित वाले ?? – jmetz

+0

काम पर, हमारे matlab इंस्टॉल केवल पढ़ने के लिए हैं, इसलिए फ़ाइलों को स्वयं बदलना संभव नहीं है। और हमेशा मज़ा के myfuninstead का उपयोग करना सुविधाजनक नहीं है। खासकर जब यह डिफ़ॉल्ट व्यवहार में सुधार के बारे में है। असली दुनिया का आवेदन: [डैनियल केसलर की समस्या] (http://stackoverflow.com/questions/11779511/how-to-interrupt-matlab-ide-when-it-hangs-on-displaying-very-large-array) –

3

हाँ यह संभव है, लेकिन यह हैकिंग का एक सा की आवश्यकता है में बनाया को भेजी जाती हैं चाहता है में बहुत उपयोगी होगा। यह आवश्यक है कि आप कुछ फ़ंक्शन हैंडल के आसपास प्रतिलिपि बनाएँ।

प्रश्न में दिए गए उदाहरण का उपयोग करके मैं दिखाता हूं कि उपयोगकर्ता परिभाषित फ़ंक्शन में फ़ंक्शन openvar को कैसे लपेटना है जो इनपुट चर के आकार की जांच करता है और फिर उपयोगकर्ता को चर के लिए किसी भी खुले ऑपरेशन को रद्द करने की अनुमति देता है।

इसके अतिरिक्त, यह काम करना चाहिए जब उपयोगकर्ता Matlab IDE के वर्कस्पेस फलक में एक चर को क्लिक करता है।

हमें तीन चीजें करने की आवश्यकता है।

  1. मूल openvar समारोह
  2. आवरण समारोह है कि openvar
  3. कॉल को परिभाषित करें हमारे नए कार्य करने के लिए मूल openvar नाम पुन: निर्देशित करने के लिए एक संभाल प्राप्त करें।

उदाहरण समारोह

function openVarWrapper(x, vector) 

    maxVarSize = 10000; 
    %declare the global variable 
    persistent openVarHandle; 

    %if the variable is empty then make the link to the original openvar 
    if isempty(openVarHandle) 
     openVarHandle = @openvar; 
    end 

    %no variable name passed, call was to setup connection 
    if narargin==0 
     return; 
    end 


    %get a copy of the original variable to check its size 
    tmpVar = evalin('base', x);   

    %if the variable is big and the user doesn't click yes then return 
    if prod(size(tmpVar)) > maxVarSize 
     resp = questdlg(sprintf('Variable %s is very large, open anyway?', x)); 
     if ~strcmp(resp, 'Yes') 
      return; 
     end 
    end 

    if ischar(x) && ~isempty(openVarHandle); 
     openVarHandle(x); 
    end 
end 

एक बार इस समारोह तो परिभाषित किया गया है तो आप बस एक स्क्रिप्ट निष्पादित करने के लिए कि

  • openvar
  • नामित किसी भी चर साफ़ करता है की जरूरत है सेटअप करने के लिए openVarWrapper स्क्रिप्ट चलाने कनेक्शन
  • मूलइंगित करें

उदाहरण स्क्रिप्ट openVarWrapper रहे हैं: तुम सब कुछ साफ करने के लिए चाहते हैं जब

clear openvar; 
openVarWrapper; 
openvar = @openVarWrapper; 

अंत में आप बस फोन कर सकते हैं:

clear openvar; 
+0

फ़ाइलपैथ से सटीक होने के लिए, छायांकित फ़ंक्शन पर हैंडल प्राप्त करना आसान होना चाहिए। आपके समाधान के लिए कुछ प्रारंभिक आवश्यकता होती है (हर बार जब आप 'सभी साफ़ करें' का उपयोग करते हैं)। [मेरा समाधान] (http://stackoverflow.com/a/11781650/1162609) पथ और पीछे सीडीइंग की आवश्यकता है, लेकिन यह सभी हैकर है। मुझे अभी भी उम्मीद है कि कोई बेहतर तरीके से आ जाएगा: पी –