オーバーロードされた関数の組み込みバージョンを呼び出す前にカスタムアクションを実行するためにOctaveで組み込み関数をオーバーロードしようとしています。 MATLAB(そしておそらくOctave)では、私はbuiltin
関数を使ってこれを行うことができます。Octaveで組み込み関数をオーバーロードするときの組み込み関数の不一致
典型的な関数定義は、私のカスタムアクションの実行後に/ビルトインからどこ前方の全ての入力/出力を次のようになります。今、私は、このファイル(disp.m
)を配置した場合
function varargout = disp(varargin)
% Do a custom thing
fprintf('Calling overloaded disp!\n')
% Now call the builtin
[varargout{1:nargout}] = builtin('disp', varargin{:});
end
を上私のパスは、disp
を呼び出す関数は、内蔵のdisp
関数を呼び出す前に余分な情報を出力するオーバーロードされたバージョンを実行します。
>> disp('hello world')
Calling overloaded disp!
hello world
私がいる問題は、これが一部組み込み関数ではなく、すべてのために働くということです。たとえば、figure
をオーバーロードしようとするとします。
function varargout = figure(varargin)
disp('Creating a figure!')
[varargout{1:nargout}] = builtin('figure', varargin{:});
end
私はこれを呼び出して、builtin
は再びむしろ真のビルトインよりもオーバーロードされた関数を呼び出します。
>> figure()
Creating a figure!
Creating a figure!
Creating a figure!
...
error: max_recursion_depth exceeded
私は、コマンドライン関数としてfigure
をオーバーロードするのではなくfigure.m
でそれを保存する場合は興味深いことに、それは私が期待どおりに動作します。これをデバッグすると、あなたはビルトインと同じ名前の関数を持っている場合Octaveは(明らかに)警告を発していることであった
> function varargout = figure(varargin), disp('here'), [varargout{1:nargout}] = builtin('figure', varargin{:}), endfunction
> figure()
here
は今、一つのことは、私は気づきました。
警告:あなたは警告を見れば、彼らが過負荷に作品を機能と機能しないもののために、わずかに異なっている機能./disp.m影組み込み関数<は -
ワークス警告:機能./figure.m影コアライブラリ機能< - ドキュメントは、コアライブラリ関数と組み込み関数間のいずれかの区別をするようには見えません。また、この動作がで言及されていない
動作しませんbuiltin
のドキュメント
この問題の原因は何ですか?この問題を回避するにはどうすればよいですか?
おかげでそれは非常にうまく物事をクリアして。つまり、これらのコア機能に過負荷をかけるための良い選択肢がありますか?例えば、スクリプトには 'run'があります。 – Suever
@残念ながら残念ながら、私は良い選択肢がないことを知っていません。醜い回避策があります(私の編集を参照)。 – carandraug
ありがとうございました!確かに醜い回避策が、私はそれが私たちが組み込み関数をオーバーロードしようとするものだと思います! – Suever