5

在编写/调试函数时,我喜欢使用单元模式而不是断点。

您将如何在运行时确定当前执行的代码是作为函数执行还是使用单元模式执行?

奖励积分如果你能想出一个function知道它是从另一个函数或单元格中调用的。

当您想在函数执行期间以不同方式加载数据或您想创建绘图仪进行调试时,这可能有用的一个示例。在作为单元格或函数执行之间切换时注释掉特定行变得很痛苦。

function doSomethingAwesome(inputs)
%%

if executingAsCell == true
  clear
  importData
end


% process stuff

if executingAsCell == true
   plot(myAwesomeResults)
end

请注意,这不是我之前的问题的重复: 如何确定代码是作为脚本还是函数执行?

4

1 回答 1

2

最简单的方法是dbstack()按照@Junuxx 的建议使用:

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

如果要确定是否处于调试模式,一种可能性是使用linedbstack 中的 -argument,并检查在明显调用函数的行上是否有对当前正在执行的函数的调用。

于 2013-02-01T16:30:30.673 回答