如何在MATLAB中使用subsref

如何在MATLAB中使用subsref,matlab,Matlab,我用16a。我发现重载subsref会对对象调用()进行任何函数调用。我不确定这是否正确使用subsref。比如说, classdef A < handle methods function obj = A(varargin) end function v = subsref(obj, S) %#ok<STOUT,INUSD> assert(false); end

我用16a。我发现重载subsref会对对象调用()进行任何函数调用。我不确定这是否正确使用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
如果我删除了subsref,它可以正常工作。就


subsref仅在{i}、A(i)或A.field时调用。既然foo是一种方法,为什么subsref仍然被调用?

这完全是意料之中的行为,因为对MATLAB来说,
a.field
a.method
都使用点引用,因此由
subsref
处理。解决这个问题的典型方法是使用标准函数调用而不是点引用的方法调用来调用类方法

method(A)

%// Rather than
A.method()

这种用法也很优越,因为它可以在对象数组上操作,而不仅仅是在标量上。此外,它也是。

用户可以实现像containers.Map这样的数据结构吗?它有A(i)和A(i)=,还有A.length()、A.isKey()、…@JoeC Yes。您必须检查subsref的输入,以确定它是方法调用还是属性访问
method(A)

%// Rather than
A.method()