Можете ли вы определить во время выполнения, если исполняемый код работает как функция или script? Если да, то какой рекомендуемый метод?
Как определить, выполняется ли код как script или функция?
Ответ 1
+1 для очень интересного вопроса.
Я могу придумать способ определения этого. Разберите исполняемый файл m и проверьте первое слово в первой нетривиальной строке без комментария. Если это ключевое слово function
, это файл функции. Если это не так, это a script.
Здесь аккуратный однострочный:
strcmp(textread([mfilename '.m'], '%s', 1, 'commentstyle', 'matlab'), 'function')
Результирующее значение должно быть 1, если оно является файлом функции, и 0, если оно script.
Имейте в виду, что этот код необходимо запускать из рассматриваемого m файла, а не из отдельного файла функций, конечно. Если вы хотите сделать из этого универсальную функцию (то есть проверять любой m файл), просто передайте искомую строку имени файла в textread
, например:
function y = isfunction(x)
y = strcmp(textread([x '.m'], '%s', 1, 'commentstyle', 'matlab'), 'function')
Чтобы сделать эту функцию более надежной, вы также можете добавить код обработки ошибок, который проверяет, что файл m фактически существует, прежде чем пытаться выполнить textread
его.
Ответ 2
Есть и другой способ. nargin(...)
дает ошибку, если она вызывается на script. Поэтому следующая короткая функция должна делать то, что вы просите:
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
Это может быть не самый красивый способ, но он работает.
Привет