您能否在运行时确定执行的代码是作为函数还是脚本运行?如果是,推荐的方法是什么?
问问题
148 次
2 回答
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
这可能不是最漂亮的方式,但它确实有效。
问候
于 2013-01-21T17:56:18.340 回答
6
+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
。
于 2013-01-21T17:26:01.513 回答