Вопрос по matlab, enumeration, oop – Как я могу отобразить значение перечисления в объекте MATLAB

7

Учитывая следующие два класса

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 = [email protected](This);
            groups.PropertyList.enumValue = char(This.enumValue);
        end
    end
end

Теперь дисплей выглядит так:

>> C = EnumDisplay()

C = 

  EnumDisplay with properties:

      enumValue: 'enumVal1'
    numberValue: 1

Это почти там, но не совсем. Я не хочу, чтобы перечисленное значение было в кавычках.

Ваш Ответ

1   ответ
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, Но если вы действительно в отчаянии, возможно, что-то подобное сработает.

Похожие вопросы