実行時に実行されたコードが関数として実行されているのかスクリプトとして実行されているのかを判断できますか?はいの場合、推奨される方法は何ですか?
2 に答える
7
別の方法があります。nargin(...)
スクリプトで呼び出すとエラーになります。したがって、次の短い関数は、求めていることを実行する必要があります。
function result = isFunction(functionHandle)
%
% functionHandle: Can be a handle or string.
% result: Returns true or false.
% Try nargin() to determine if handle is a script:
try
nargin(functionHandle);
result = true;
catch exception
% If exception is as below, it is a script.
if (strcmp(exception.identifier, 'MATLAB:nargin:isScript'))
result = false;
else
% Else re-throw error:
throw(exception);
end
end
それは最もきれいな方法ではないかもしれませんが、うまくいきます。
よろしく
于 2013-01-21T17:56:18.340 に答える
6
非常に興味深い質問に+1。
それを判断する方法を考えることができます。実行された m ファイル自体を解析し、最初の重要な非コメント行の最初の単語をチェックします。キーワードならfunction
関数ファイルです。そうでない場合は、スクリプトです。ここにきちんとしたワンライナーがあります:
strcmp(textread([mfilename '.m'], '%s', 1, 'commentstyle', 'matlab'), 'function')
結果の値は、関数ファイルの場合は 1、スクリプトの場合は 0 になります。
もちろん、このコードは、別の関数ファイルからではなく、問題の m ファイルから実行する必要があることに注意してください。それから一般的な関数 (つまり、任意の m ファイルをテストする関数) を作成したい場合は、次のtextread
ように、目的のファイル名の文字列を に渡すだけです。
function y = isfunction(x)
y = strcmp(textread([x '.m'], '%s', 1, 'commentstyle', 'matlab'), 'function')
この関数をより堅牢にするために、m ファイルを試行する前に実際に存在することを確認するエラー処理コードを追加することもできますtextread
。
于 2013-01-21T17:26:01.513 に答える