debugging 如何确定代码是作为脚本还是函数执行?

pieyvz9o  于 2023-06-23  发布在  其他
关注(0)|答案(3)|浏览(148)

你能在运行时确定执行的代码是作为函数还是脚本运行吗?如果是,推荐的方法是什么?

eqqqjvef

eqqqjvef1#

还有一个办法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

这可能不是最好的方法,但它有效。
问候

0sgqnhkj

0sgqnhkj2#

+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')

为了使这个函数更加健壮,您还可以添加错误处理代码,在尝试textread之前验证m文件是否确实存在。

vjhs03f7

vjhs03f73#

您可以使用以下代码来检查m文件是函数还是脚本。

% Get the file's name that is currently being executed
file_fullpath = (mfilename("fullpath"))+".m";

t = mtree(file_fullpath ,'-file');
x = t.FileType

if(x.isequal("FunctionFile"))
    disp("It is a function!");
end
if(x.isequal("ScriptFile"))
    disp("It is a script!");
end

相关问题