如何确定是否在调用函数后接分号(“;”)?

ysa*_*sap 5 matlab expression function

在Matlab脚本中,我调用了用户定义的函数(m函数)。当使用disp和/或fprintf调用将值打印到命令窗口时,我的函数返回一个值。

在编写表达式或语句时,请;在其末尾禁止打印。当表达式调用我的函数时,;可以抑制返回值的打印。但是,这不会影响所disp调用函数中的输出。

我想在适当的时候消除函数的显示输出。有没有办法确定是否在以结尾的表达式中进行了函数调用;

hor*_*ler 4

我喜欢你尝试做的事情的精神,但我认为它可能违背 Matlab 中的常见编程模式。正如您正确指出的那样,终止分号的目的是禁止打印返回值。试图让它融入你的其他功能很可能需要一些深度的黑客攻击和丑陋的难以维护的代码。实现您所描述内容的标准方法是通过属性名称-值对参数。例如,Matlab 的优化套件有一个名为 的属性\'Display\',可以将其设置为各种值以指示所需的详细级别(请参阅 参考资料optimset)。

\n\n

如果您想尝试寻找一种方法来检查终止分号,您可以查看未记录的mintmlintmexmtree函数 \xe2\x80\x93在此处阅读更多信息。不幸的是,使用 mlint 来简单地检查“Terminate statements with semicolon to subsupport”警告(请参阅 MatlabCental File Exchange 上的此函数) won\'t work in all cases as a function call by itself doesn\'t produce this warning.

\n\n

更新

\n\n

这里尝试将代码插入到被调用的函数中,以确定调用者的行是否以分号终止。您应该意识到这还没有经过彻底的测试,并且可能非常脆弱。我还没有使用子函数或匿名函数对其进行测试,并且我知道如果您使用以下命令将一行多行换行,它会失败....

\n\n
st = dbstack(\'-completenames\');  % M-file of caller and line number\ncaller = st(2);\nstr = mlint(\'-lex\',caller.file); % Struct containing parsed data\n\nisSemicolon = false; % Assume no semicolon\nfor i = 1:length(str)\n    % Find end-of-line corresponding to function call\n    c = strsplit(str(i).message,\'/\');\n    if str2double(c{1}) == caller.line && strcmp(c{2}(end-5:end-1),\'<EOL>\')\n        % Check for comments\n        j = i-1;\n        if ~isempty(strfind(str(j).message,\'%\'))\n            j = j-1;\n        end\n        % Check for semicolon\n        if strcmp(str(j).message(end-2),\';\')\n            isSemicolon = true; % Semicolon found\n            break;\n        end\n    end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

换句话说,可以通过尝试来学习,但我不建议实际使用它。

\n