2016-04-24 25 views
2

我使用16a。我發現重載subsref會調用一個對象call()。我不確定這是否是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); 

如果我刪除subsref,它工作正常。在

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

的subsref方面被稱爲僅當A {I},A(i)或A.field。既然foo是一種方法,爲什麼subsref仍然被調用?

回答

4

這完全是正常現象,因爲MATLAB,A.fieldA.method使用點引用,因此受到subsref處理。解決此問題的典型方法是使用標準函數調用而不是點引用方法調用來調用您的類方法。

method(A) 

%// Rather than 
A.method() 

這個用法也是優越的,因爲它可以在對象數組上運行,而不僅僅是標量。另外,它是more performant

+0

用戶可以實現像container.Map這樣的數據結構嗎?它有A(i)和A(i)=,還有A.length(),A.isKey(),... –

+1

@JoeC是的。你必須檢查輸入到'subsref'來確定它是方法調用還是屬性訪問 – Suever