2016-04-24 10 views
2

私は16aを使用します。オーバーロードsubsrefがオブジェクト呼び出し()への関数呼び出しを行うのを発見しました。これがsubsrefの正しい使用であるかどうかはわかりません。たとえば、MATLABでsubsrefを使用する方法

classdef A < handle 
    methods 
     function obj = A(varargin) 
     end 

     function v = subsref(obj, S) %#ok<STOUT,INUSD> 
      assert(false); 
     end 

     function c = foo(obj) %#ok<MANU> 
      c = 1; 
     end 
    end 
end 

次に、fooを使用すると次のエラーが表示されます。

>> a = A() 

a = 

    A with no properties. 

>> a.foo() 
Error using A/subsref (line 6) 
Assertion failed. 

8    assert(false); 

サブリファレンスを削除した場合、正常に動作します。

http://www.mathworks.com/help/matlab/ref/subsref.html

のsubsrefの観点から呼び出されたときにのみ、{I}、A(i)またはA.field。 fooはメソッドなので、subsrefはまだ呼び出されているのはなぜですか? MATLABに、A.fieldA.method両方ドット参照を使用し、したがって、subsrefによって処理されるため

答えて

4

これは、完全に予想される動作です。これを回避する典型的な方法は、代わりにドット参照のメソッド呼び出しではなく、標準の関数呼び出しを使用してクラスメソッドを呼び出すことです。

method(A) 

%// Rather than 
A.method() 

この使用法は、スカラーだけでなくオブジェクトの配列を操作できるため、優れています。また、more performantです。

+0

ユーザーはcontainers.Mapのようなデータ構造を実装できますか? A.length()、A.isKey()、... –

+1

@JoeCはい。これはA(i)とA(i)入力が 'subsref'をチェックして、それがメソッド呼び出しかプロパティアクセスかを判断する必要があります – Suever

関連する問題