如何在MATLAB对象中显示枚举值

时间:2014-03-03 16:30:11

标签: matlab oop enumeration

给出以下两个类

classdef EnumClass

    enumeration
        enumVal1
        enumVal2
    end
end


classdef EnumDisplay

    properties
        enumValue = EnumClass.enumVal1
        numberValue = 1
    end
end

显示EnumClass时,会显示以下值:

>> E = EnumClass.enumVal1

E = 

    enumVal1

但是在命令窗口中显示EnumDisplay时,枚举值被抑制,只显示数组大小和类。

>> C = EnumDisplay()

C =

  EnumDisplay with properties:

      enumValue: [1x1 EnumClass]
    numberValue: 1

在类属性列表中显示枚举值的最简单方法是什么。即是否有一种简单而通用的方法让课程显示如下:

>> C = EnumDisplay()

C =

  EnumDisplay with properties:

      enumValue: enumVal1
    numberValue: 1

我怀疑这与从某个地方继承matlab.mixin.CustomDisplay类有关,但是我希望它尽可能通用,以限制我需要为每个枚举类做的编码量,以及/或每个在属性中具有枚举值的类。

部分解决方案

我能够找到解决这个问题的部分解决方案,但效果并不理想。

classdef EnumDisplay < matlab.mixin.CustomDisplay

    properties
        enumValue = EnumClass.enumVal1
        numberValue = 1
    end

    methods (Access = protected)
        function groups = getPropertyGroups(This)
            groups = getPropertyGroups@matlab.mixin.CustomDisplay(This);
            groups.PropertyList.enumValue = char(This.enumValue);
        end
    end
end

现在显示如下:

>> C = EnumDisplay()

C = 

  EnumDisplay with properties:

      enumValue: 'enumVal1'
    numberValue: 1

这几乎就在那里,但并不完全。我不希望枚举值在引号中。

1 个答案:

答案 0 :(得分:0)

好吧,好吧......这不是最优雅的方法 - 当然不像使用matlab.mixin.CustomDisplay那样优雅 - 但有一种可能性就是尝试自己复制这些功能,以一种给你的方式更多的控制。这是我在渡轮上一起砍的......

classdef EnumDisplay

    properties
        enumValue = EnumClass.enumVal1
        numberValue = 1
    end

    methods
        function disp(This)
            cl = class(This) ;
            fprintf('  <a href="matlab:helpPopup %s">%s</a> with properties: \n\n',cl,cl) ;
            prop = properties(This) ;
            len = max(cellfun(@length,prop)) ;

            for ii = 1:numel(prop)
                if isnumeric(This.(prop{ii}))
                    fmt = '%g' ;
                else
                    fmt = '%s' ;
                end
                filler = char(repmat(32,1,4+len-length(prop{ii}))) ;
                fprintf('%s%s: ',filler,prop{ii}) ;
                fprintf(sprintf('%s \n',fmt),char(This.(prop{ii}))) ;
            end
        end
    end
end

结果:

>> C = EnumDisplay()

C = 

  EnumDisplay with properties: 

      enumValue: enumVal1 
    numberValue: 1 

唯一的问题是,这可能不是完全通用的,因为我可能没有适当地涵盖所有可能的格式fmt。但如果你真的很绝望,也许这样的事情会起作用。