Я работаю с некоторым кодом, который использует значения из класса enumeration
(расширение uint8
) для доступа к столбцам матрицы «по имени», а не по жестко заданному номеру. Причиной такого подхода является то, что матрицы воспринимаются как более производительные по сравнению с другими конструкциями, которые разрешают доступ к именованным полям (например, структуры / объекты или таблицы), что, предположительно, улучшает читаемость кода без ущерба для производительности.
Проблема в том, что что класс enum находится внутри пакета, давая ему довольно длинное имя. Это значительно ухудшает читабельность до такой степени, что почти полностью отрицает цель «именованных индексов»:
% What it looks like without using an enum:
val = foo(:, 7); % Magic number, :(
% Current situation (the enum is called "somePackage.SomeMeaningfulCollectionEnum"):
val = foo(:, somePackage.SomeMeaningfulCollectionEnum.varName1); % Very long name, :(
% Desired solution:
E = somePackage.SomeMeaningfulCollectionEnum; % This throws an error in R2020a
val = foo(:, E.varName1); % Short and descriptive!
При попытке использовать «желаемое решение» выше, мы получаем следующую ошибку:
Error using somePackage.SomeMeaningfulCollectionEnum
Cannot call the constructor of 'somePackage.SomeMeaningfulCollectionEnum' outside of its enumeration block.
Я предложил обходной путь, заключающийся в сохранении каждого члена перечисления в поле struct
с тем же именем (см. мой собственный ответ ниже ), но мне интересно, есть ли " правильный "способ сделать это.