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 の長さをチェックすることで、別の関数から呼び出されたのか、ベース/セルから呼び出されたのかを知ることができます。

   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 の - 引数を使用して、見かけの呼び出し関数の行に現在実行中の関数への呼び出しがあるかどうかを確認する方法があります。

于 2013-02-01T16:30:30.673 に答える