Как определить, выполняется ли код как скрипт или функция?

Можете ли вы определить во время выполнения, выполняется ли исполняемый код как функция или скрипт? Если да, то какой рекомендуемый метод?


person slayton    schedule 21.01.2013    source источник


Ответы (2)


+1 за очень интересный вопрос.

Я могу придумать способ определить это. Разбираем сам исполняемый m-файл и проверяем первое слово в первой нетривиальной строке без комментариев. Если это ключевое слово function, это файл функции. Если нет, то это скрипт. Вот аккуратная строчка:

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

Результирующее значение должно быть 1, если это файл функции, и 0, если это скрипт.

Имейте в виду, что этот код нужно запускать из рассматриваемого m-файла, а не из отдельного файла функции, разумеется. Если вы хотите сделать из этого универсальную функцию (то есть, которая проверяет любой m-файл), просто передайте нужную строку имени файла в textread, например:

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

Чтобы сделать эту функцию более надежной, вы также можете добавить код обработки ошибок, который проверяет, что m-файл действительно существует, прежде чем пытаться его textread.

person Eitan T    schedule 21.01.2013

Есть еще один способ. 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

Возможно, это не самый красивый способ, но он работает.

С Уважением

person KlausCPH    schedule 21.01.2013