在MATLAB中重载“点”运算符

时间:2014-03-07 04:51:38

标签: matlab operator-overloading

我在MATLAB中编写了一个简单的类来管理一组键值对。我希望能够在对象名称之后使用点来访问键,如:

params.maxIterations

而不是:

params.get('maxIterations')

是否可以覆盖点运算符以便调用我的get()方法?

我试图按照建议的here覆盖subsasgn()方法,但我无法弄清楚应该如何编写它。

1 个答案:

答案 0 :(得分:5)

您可以使用dynamic properties。然后,不是添加字符串列表,而是为每个“键”添加新属性。获取properties(MyClass)(仅fieldnames(MyClass)

的所有密钥

但是,我认为重载subsref确实是最好的,但请注意,如果你第一次这样做,那么正确地可能会耗费大部分工作周。 。这不是真的很难,只是()运算符 这么多:)

幸运的是,你没必要。方法如下:

classdef MyClass < handle

    methods

        function result = subsref(obj, S)

            %// Properly overloading the () operator is *DIFFICULT*!!
            %// Therefore, delegate everything to the built-in function, 
            %// except for 1 isolated case:

            try
                if ~strcmp(S.type, '()') || ...
                   ~all(cellfun('isclass', S.subs, 'char'))

                    result = builtin('subsref', obj, S);

                else                    
                    keys = S.subs %// Note: cellstring; 
                                  %// could contain multiple keys

                    %// ...and do whatever you want with it

                end

            catch ME
                %// (this construction makes it less apparent that the
                %// operator was overloaded)
                throwAsCaller(ME);   

            end

        end % subsref method

    end % methods

end % class