2013-01-21 22 views
11

क्या आप रनटाइम पर निर्धारित कर सकते हैं यदि निष्पादित कोड फ़ंक्शन या स्क्रिप्ट के रूप में चल रहा है? यदि हां, तो अनुशंसित विधि क्या है?यह निर्धारित करने के लिए कि कोड स्क्रिप्ट या फ़ंक्शन के रूप में निष्पादित कर रहा है या नहीं?

उत्तर

6

+1 एक बहुत ही रोचक प्रश्न के लिए।

मैं इसे निर्धारित करने का एक तरीका सोच सकता हूं। निष्पादित एम-फाइल को स्वयं पार्स करें और पहले गैर-तुच्छ गैर-टिप्पणी पंक्ति में पहला शब्द देखें। यदि यह function कीवर्ड है, तो यह एक फ़ंक्शन फ़ाइल है। यदि यह नहीं है, तो यह एक स्क्रिप्ट है।

strcmp(textread([mfilename '.m'], '%s', 1, 'commentstyle', 'matlab'), 'function') 

परिणामस्वरूप मूल्य 1 होना चाहिए अगर यह एक समारोह फ़ाइल है, और 0 अगर यह एक स्क्रिप्ट है: यहाँ एक साफ एक लाइनर है।

ध्यान रखें कि इस कोड को एम-फाइल से प्रश्न में चलाने की जरूरत है, न कि एक अलग फ़ंक्शन फ़ाइल से। आप में से है कि (यानी एक है कि किसी भी एम-फ़ाइल का परीक्षण करती है) बाहर एक सामान्य समारोह बनाना चाहते हैं, बस textread के लिए वांछित फ़ाइल नाम स्ट्रिंग गुजरती हैं, तो जैसे:

function y = isfunction(x) 
    y = strcmp(textread([x '.m'], '%s', 1, 'commentstyle', 'matlab'), 'function') 

इस समारोह और अधिक मजबूत बनाने के लिए , आप एरर-हैंडलिंग कोड भी जोड़ सकते हैं जो सत्यापित करता है कि एम-फाइल वास्तव में textread पर प्रयास करने से पहले मौजूद है।

+1

बिल्कुल सही, धन्यवाद! – slayton

7

एक और तरीका है। nargin(...) एक स्क्रिप्ट पर कॉल होने पर त्रुटि देता है। इसलिए निम्न लघु कार्य को आप जो करना चाहते हैं, उसे करना चाहिए:

function result = isFunction(functionHandle) 
% 
% functionHandle: Can be a handle or string. 
% result:   Returns true or false. 

% Try nargin() to determine if handle is a script: 
try  
    nargin(functionHandle); 
    result = true; 
catch exception 
    % If exception is as below, it is a script. 
    if (strcmp(exception.identifier, 'MATLAB:nargin:isScript'))  
     result = false; 
    else 
     % Else re-throw error: 
     throw(exception); 
    end 
end 

यह सबसे सुंदर तरीका नहीं हो सकता है, लेकिन यह काम करता है।

सम्मान

+0

यह बहुत अच्छा है, धन्यवाद! – slayton