在 Matlab 脚本中,我调用了一个用户定义的函数(m 函数)。我的函数返回一个值,同时使用 disp
和/或 fprintf
调用将值打印到命令窗口。
在编写表达式或语句时,将 ;
放在末尾以禁止打印。当表达式调用我的函数时,;
可以抑制返回值的打印。但是,这不会影响所调用函数内的 disp
输出。
我想在适当的时候消除函数的显示输出。 有没有办法确定是否在以 ;
结尾的表达式中进行了函数调用?
最佳答案
我喜欢您尝试做的事情的精神,但我认为它可能违背了 Matlab 中的常见编程模式。正如您正确指出的那样,终止分号的目的是禁止打印返回值。试图让它合并您的其他功能可能需要一些深入的黑客攻击和丑陋的难以维护的代码。实现您所描述内容的标准方法是通过属性名称-值对参数。例如,Matlab 的优化套件有一个名为 'Display'
的属性,可以将其设置为各种值以指示所需的冗长级别(参见 optimset
)。
如果您想尝试寻找一种方法来检查终止分号,您可以查看未记录的 mint
、mlintmex
和 mtree
功能 – read more here .不幸的是,使用 mlint 来简单地检查“使用分号终止语句以抑制输出”警告 ( see this function on the MatlabCental File Exchange ) 在所有情况下都不起作用,因为函数调用本身不会产生此警告。
更新
这里尝试将代码插入到被调用的函数中,以确定调用者的行是否以分号结束。您应该知道,这尚未经过彻底测试,可能非常脆弱。我没有使用子函数或匿名函数对其进行测试,我知道如果使用 ...
将一行换行到多行,它会失败。
st = dbstack('-completenames'); % M-file of caller and line number
caller = st(2);
str = mlint('-lex',caller.file); % Struct containing parsed data
isSemicolon = false; % Assume no semicolon
for i = 1:length(str)
% Find end-of-line corresponding to function call
c = strsplit(str(i).message,'/');
if str2double(c{1}) == caller.line && strcmp(c{2}(end-5:end-1),'<EOL>')
% Check for comments
j = i-1;
if ~isempty(strfind(str(j).message,'%'))
j = j-1;
end
% Check for semicolon
if strcmp(str(j).message(end-2),';')
isSemicolon = true; % Semicolon found
break;
end
end
end
换句话说,玩这个来学习,但我不建议实际使用它。
关于matlab - 如何确定一个函数是否被调用后跟一个分号 (";")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27049017/