2012-11-21 17 views
5

प्रदान निम्नलिखित कोड के बराबर:मैटलैब स्थिर वर्ग के अंदर बुला

classdef highLowGame 
    methods(Static) 
     function [wonAmount, noGuesses] = run(gambledAmount) 
      noGuesses = 'something'; 
      wonAmount = highLowGame.getPayout(gambledAmount, noGuesses); % <--- 
     end 
     function wonAmount = getPayout(gambledAmount, noGuesses) 
      wonAmount = 'something'; 
     end 
    end 
end 

वहाँ एक रास्ता वर्ग के नाम लिखने के लिए बिना एक ही कक्षा के एक स्थिर विधि विधि (एक स्थिर अंदर) कॉल करने के लिए है? कुछ "self.getPayout (...)" की तरह - यदि कक्षा 500 लाइनों तक पहुंच जाती है और मैं इसका नाम बदलना चाहता हूं।

उत्तर

4

जहां तक ​​मैं कह सकता हूं, "नहीं" के साथ "नहीं"। सामान्य रूप से, आप केवल कक्षा के नाम के साथ स्थिर विधि निर्दिष्ट कर सकते हैं। हालांकि, अगर आप नकली प्रतिबंध चारों ओर अपने तरीके के बाद से MATLAB feval है कर सकते हैं:

classdef testStatic 

    methods (Static) 
     function p = getPi() %this is a static method 
      p = 3.14; 
     end 
    end 

    methods 
     function self = testStatic() 

      testStatic.getPi %these are all equivalent 
      feval(sprintf('%s.getPi',class(self))) 
      feval(sprintf('%s.getPi',mfilename('class'))) 
     end 
    end 
end 

यहाँ, वर्ग (स्वयं) और दोनों mfilename 'testStatic' का मूल्यांकन है, तो अंत तक 'testStatic.getPi' का मूल्यांकन ऊपर काम करता है।

या, वैकल्पिक रूप से, आप एक गैर स्थैतिक विधि, self.callStatic लिख सकते हैं; फिर हमेशा इसका इस्तेमाल करें। इसके अंदर, बस testStatic.getPi पर कॉल करें। तो आपको केवल उस पंक्ति को बदलने की आवश्यकता होगी।

+2

जो कि @ -फॉल्डर परिभाषित वर्ग में एक अलग फ़ंक्शन होने पर 'mfilename (' class ') होना चाहिए। – Amro

+0

हां। बिलकुल सही। ऊपर संशोधित उत्तर। – Pete

+4

अभी भी मैं बस कक्षा का नाम स्पष्ट रूप से लिखूंगा, और अगर मुझे रिफैक्टर की आवश्यकता हो तो ढूंढने/प्रतिस्थापित करने के लिए एक अच्छे संपादक पर भरोसा करें .. कक्षा का नाम ऐसा कुछ नहीं है जिसे आप अक्सर बदलना चाहते हैं। – Amro

7

सीधे आपके प्रश्न का उत्तर नहीं है, लेकिन यह ध्यान देने योग्य है कि आप अपने classdef फ़ाइल के class.m फ़ाइल में ब्लॉक के बाद "स्थानीय कार्य" भी डाल सकते हैं, और ये निजी स्थिर तरीकों की तरह व्यवहार करते हैं, लेकिन आपको इसकी आवश्यकता नहीं है कक्षा के नाम का उपयोग करके उन्हें आमंत्रित करने के लिए। अर्थात।

% myclass.m 
classdef myclass 
    methods (Static) 
    function x = foo() 
     x = iMyFoo(); 
    end 
    end 
end 
function x = iMyFoo() 
    x = rand(); 
end 
% end of myclass.m 
+0

कक्षाdef के अंत के बाद कार्यों को डाल? दिलचस्प :) –

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