元の関数とまったく同じ名前の関数のラッパーを作成することは可能ですか?
これは、入力変数が組み込み関数に渡される前に、ユーザーが追加のチェックを実行したい場合に非常に便利です。
元の関数とまったく同じ名前の関数のラッパーを作成することは可能ですか?
これは、入力変数が組み込み関数に渡される前に、ユーザーが追加のチェックを実行したい場合に非常に便利です。
実際には、slaytonの答えの代わりに、を使用する必要はありませんopenvar
。matlab関数と同じ名前の関数を定義すると、その関数がシャドウされます(つまり、代わりに呼び出されます)。
その後、独自の関数を再帰的に呼び出さないようにするには、を使用してラッパー内から元の関数を呼び出すことができますbuiltin
。
例えば
outputs = builtin(funcname, inputs..);
rand.m
名前が付けられ、matlabパスにある簡単な例:
function out = main(varargin)
disp('Test wrapping rand... calling rand now...');
out = builtin('rand', varargin{:});
これは、によって検出された関数に対してのみ機能することに注意builtin
してください。そうでない人にとっては、slaytonのアプローチがおそらく必要です。
はい、これは可能ですが、少しハッキングする必要があります。一部の関数ハンドルをコピーする必要があります。
openvar
質問で提供されている例を使用して、入力変数のサイズをチェックし、ユーザーが大きすぎる変数のオープン操作をキャンセルできるようにするユーザー定義関数で関数をラップする方法を示します。
さらに、ユーザーが Matlab IDE のワークスペース ペインで変数をダブルクリックすると、これが機能するはずです。
3 つのことを行う必要があります。
openvar
元の関数のハンドルを取得するopenvar
openvar
元の名前を新しい関数にリダイレクトします。例の機能
function openVarWrapper(x, vector)
maxVarSize = 10000;
%declare the global variable
persistent openVarHandle;
%if the variable is empty then make the link to the original openvar
if isempty(openVarHandle)
openVarHandle = @openvar;
end
%no variable name passed, call was to setup connection
if narargin==0
return;
end
%get a copy of the original variable to check its size
tmpVar = evalin('base', x);
%if the variable is big and the user doesn't click yes then return
if prod( size( tmpVar)) > maxVarSize
resp = questdlg(sprintf('Variable %s is very large, open anyway?', x));
if ~strcmp(resp, 'Yes')
return;
end
end
if ischar(x) && ~isempty(openVarHandle);
openVarHandle(x);
end
end
この関数が定義されたら、スクリプトを実行するだけです。
openvar
openVarWrapper
スクリプトを実行して接続をセットアップしますopenVar
を指すopenVarWrapper
スクリプト例:
clear openvar;
openVarWrapper;
openvar = @openVarWrapper;
最後に、すべてをクリーンアップしたい場合は、次のように呼び出すだけです。
clear openvar;