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

hoo*_*one 7 oop matlab enumeration

鉴于以下两个类

classdef EnumClass

    enumeration
        enumVal1
        enumVal2
    end
end


classdef EnumDisplay

    properties
        enumValue = EnumClass.enumVal1
        numberValue = 1
    end
end
Run Code Online (Sandbox Code Playgroud)

显示时,显示EnumClass该值:

>> E = EnumClass.enumVal1

E = 

    enumVal1
Run Code Online (Sandbox Code Playgroud)

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

>> C = EnumDisplay()

C =

  EnumDisplay with properties:

      enumValue: [1x1 EnumClass]
    numberValue: 1
Run Code Online (Sandbox Code Playgroud)

在类属性列表中显示枚举值的最简单方法是什么.也就是说有一个简单而通用的方法让类显示如下:

>> C = EnumDisplay()

C =

  EnumDisplay with properties:

      enumValue: enumVal1
    numberValue: 1
Run Code Online (Sandbox Code Playgroud)

我怀疑这与继承自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
Run Code Online (Sandbox Code Playgroud)

现在显示如下:

>> C = EnumDisplay()

C = 

  EnumDisplay with properties:

      enumValue: 'enumVal1'
    numberValue: 1
Run Code Online (Sandbox Code Playgroud)

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

tra*_*ion 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
Run Code Online (Sandbox Code Playgroud)

结果:

>> C = EnumDisplay()

C = 

  EnumDisplay with properties: 

      enumValue: enumVal1 
    numberValue: 1 
Run Code Online (Sandbox Code Playgroud)

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