Debugging 如何确定代码是作为函数执行还是使用单元模式执行
在编写/调试函数时,我喜欢使用断点,而不是断点 如何在运行时确定当前执行的代码是作为函数执行还是使用单元模式执行 如果你能想出一个Debugging 如何确定代码是作为函数执行还是使用单元模式执行,debugging,matlab,Debugging,Matlab,在编写/调试函数时,我喜欢使用断点,而不是断点 如何在运行时确定当前执行的代码是作为函数执行还是使用单元模式执行 如果你能想出一个函数,知道它是从另一个函数或单元格中调用的,那么你就可以获得额外的积分 例如,当您希望在函数执行期间以不同方式加载数据,或者希望创建用于调试的绘图仪时,这可能有用。在作为单元格或函数执行之间切换时,注释掉特定的行是一件痛苦的事情 function doSomethingAwesome(inputs) %% if executingAsCell == true c
函数
,知道它是从另一个函数或单元格中调用的,那么你就可以获得额外的积分
例如,当您希望在函数执行期间以不同方式加载数据,或者希望创建用于调试的绘图仪时,这可能有用。在作为单元格或函数执行之间切换时,注释掉特定的行是一件痛苦的事情
function doSomethingAwesome(inputs)
%%
if executingAsCell == true
clear
importData
end
% process stuff
if executingAsCell == true
plot(myAwesomeResults)
end
注意,这与我之前的问题不同:最简单的方法是使用@Junuxx建议的
dbstack()
:
if isempty(dbstack)
%# true if you evaluated the cell while not in debug mode
类似地,通过检查dbstack的长度,函数可以知道它是从另一个函数还是从base/cell调用的
function doSomething
if length(dbstack)==1
%# the function has been invoked from a cell or the command line
%# (unless you're in debug mode)
函数实际上可以区分是从命令行还是从单元格调用,因为后者不会写入历史:
function doSomething
if length(dbstack)==1
javaHistory=com.mathworks.mlservices.MLCommandHistoryServices.getSessionHistory;
lastCommand = javaHistory(end).toCharArray'; % ' added for SO code highlighting
if strfind(lastCommand,'doSomething')
%# Probably invoked via command line
else
%# Probably invoked via executing a cell
如果您想确定是否处于调试模式,一种可能性是使用dbstack中的
行
-参数,并检查是否有对当前正在执行的函数的调用,即外观调用函数。+1个有趣的问题。第一个想法(丑陋的黑客):在函数/脚本中首先定义一个伪变量,然后检查它是否已定义,怎么样?你也许可以用它来完成,但不确定。@Slayton:谢谢你的编辑。由于我使用了Amro提供的用户脚本(参见TagWiki),因此我不再有代码突出显示问题
function doSomethingAwesome(inputs)
%%
if executingAsCell == true
clear
importData
end
% process stuff
if executingAsCell == true
plot(myAwesomeResults)
end