2012-08-02 15 views
6

元の関数とまったく同じ名前の関数の周りにラッパーを作成できますか?既存の関数を同じ名前の新しい関数でラップする方法

これは、彼らがはい、これは可能ですが、それはハッキングのビットを必要とHow to interrupt MATLAB IDE when it hangs on displaying very large array?

+0

私はあなたが他の質問に投稿した回答に同意します(http://stackoverflow.com/questions/11779511/how-to-interrupt-matlab-ide-when-it-hangs-on-displaying-very-large-配列)は、その質問slaytonには良いですが、一般的な質問はより良い答えを持っています - 下記を参照してください。 – jmetz

答えて

11

実際に代わり、あなたがする必要はありません答えるのを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によって発見された機能のためにのみ動作という。そうでない人にとっては、スレイトンのアプローチが必要である可能性が高い。

+0

しかし、そこにはたくさんの機能が組み込まれていないので、それらをすべて包み込みたいのです! –

+0

@GuntherStruyf:なぜあなたはそれらのすべてを包み込みたいのですか?特に非組み込みのものは何ですか? – jmetz

+0

職場では、私たちのmatlabのインストールは読み取り専用なので、ファイル自体を変更することはできません。そして、いつもmyfuninsteadを楽しく使うのは便利ではありません。特に、デフォルトの動作を改善しようとしている場合は特にそうです。実際のアプリケーション:[Daniel Kesslerの問題](http://stackoverflow.com/questions/11779511/how-to-interrupt-matlab-ide-when-it-hangs-on-displaying-very-large-array) –

3

機能に建てに渡される前に、ユーザが入力変数にいくつかの追加チェックをしたい状況で非常に有用であろう。いくつかの関数ハンドルをコピーする必要があります。

質問に記載されている例を使用して、入力変数のサイズをチェックし、大きすぎる変数のオープン操作をキャンセルできるユーザー定義関数に関数openvarをラップする方法を示します。

また、これは、ユーザーがMatlab IDEの[ワークスペース]ペインで変数をダブルクリックしたときに機能します。

私たちは3つのことをする必要があります。

  1. openvar関数にハンドルを取得し
  2. 私たちの新しい機能に、元openvar名をリダイレクト
  3. 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スクリプトを実行クリアというスクリプトを実行する必要があります接続
  • オリジナルを指すopenVaropenVarWrapperから

スクリプト例:あなたはすべてをクリーンアップしたいとき

clear openvar; 
openVarWrapper; 
openvar = @openVarWrapper; 

最後に、あなたは簡単に呼び出すことができます。

clear openvar; 
+0

シャドーされた関数へのハンドルを取得する方が簡単です。正確にはファイルパスから取得するだけです。あなたの解決策は何らかの初期化を必要とします( 'clear all'を使うたびに)。 [私の解決策](http://stackoverflow.com/a/11781650/1162609)は、パスとバックにcd'ingが必要ですが、それはすべてのハッカーです。私はまだ誰かがより良い方法を思い付くことを願っています:p –

関連する問題