exponenta event banner

Операции с перечислениями

Операции, поддерживаемые перечислениями

Для перечислений можно использовать логические операции, операции задания членства и сравнения строк. Эти операции также поддерживают использование перечислений в условных операторах, таких как switch и if заявления. string и char функции позволяют преобразовывать элементы перечисления в строки и char векторы.

Пример класса перечисления

В этом разделе используется WeekDays для иллюстрации выполнения операций над перечислениями. WeekDays определяет элементы, перечисляющие дни недели.

classdef WeekDays
   enumeration
      Monday, Tuesday, Wednesday, Thursday, Friday
   end
end

Сведения об определении перечислений см. в разделе Определение классов перечисления.

Методы по умолчанию

Классы перечисления имеют следующие методы по умолчанию:

methods('WeekDays')
Methods for class WeekDays:

WeekDays   char       intersect  ne         setxor     strcmpi    strncmp    union      
cellstr    eq         ismember   setdiff    strcmp     string     strncmpi 

WeekDays преобразует текстовые форматы в перечисления. Поддерживаемые форматы включают строки, char векторы, строковые массивы и массивы ячеек char векторы. Например:

f = WeekDays(["Monday" "Friday"])
f = 

  1×2 WeekDays enumeration array

    Monday    Friday

Преобразовать элементы перечисления в строки или char Векторы

Преобразование элементов перечисления в строки и char векторы полезны для создания текста, содержащего имена элементов перечисления. Например, используйте string функция для преобразования элемента перечисления в строку и включения его в предложение:

string(WeekDays.Monday) + " is our meeting day."
ans = 

    "Monday is our meeting day."

Используйте char аналогичным образом:

['Today is ' char(WeekDays.Friday) '.']
ans =

    'Today is Friday.'

Преобразовать массивы перечисления в строковые массивы или массивы ячеек char Векторы

Используйте string для преобразования массива перечисления в строковый массив:

sa = [WeekDays.Tuesday WeekDays.Thursday];
string(sa)
ans = 

  1×2 string array

    "Tuesday"    "Thursday"

Использовать cellstr преобразование массива перечисления в массив ячеек char векторы.

ca = cellstr([WeekDays.Tuesday WeekDays.Thursday]);
class(ca)
ans =

    'cell'

Обе ячейки в массиве ячеек содержат char векторы:

class([ca{1:2}])
ans =

    'char'

Реляционные операции с перечислениями, строками и char Векторы

Можно сравнить экземпляры перечисления с char векторы и строки, использующие реляционные операторы eq (==) и ne (~=), а также isequal способ.

Реляционные операторы eq и ne

Использовать eq и ne для сравнения элементов перечисления со значениями текста. Например, можно сравнить элемент перечисления со строкой:

today = WeekDays.Friday;
today == "Friday"
ans =

  logical

   1

Сравнение массива перечисления с одним char вектор. Возвращаемое значение является логическим массивом, указывающим, какие элементы массива перечисления эквивалентны char вектор:

wd = [WeekDays.Monday WeekDays.Wednesday WeekDays.Friday];
wd == 'Friday'
ans =

  1×3 logical array

   0   0   1

В этом примере используется ne функция для сравнения соответствующих элементов массива перечисления и строкового массива равной длины:

sa = ["Monday" "Wednesday" "Friday"];
md = [WeekDays.Tuesday WeekDays.Thursday WeekDays.Friday];
md ~= sa
ans =

  1×3 logical array

   1   1   0

char вектор Wednesday равно (==) элемент перечисления WeekDays.Wednesday. Это равенство можно использовать в условных операторах:

today = 'Wednesday';
   ...
if today == WeekDays.Wednesday
   disp('Team meeting at 2:00')
end

isequal Метод

isequal способ также позволяет сравнивать экземпляры перечисления и строки, символьные векторы, строковые массивы и массивы ячеек символьных векторов.

a = WeekDays.Monday;
isequal(a,"Monday")
ans =

     logical

     1

При сравнении массива перечисления с одним элементом поведение isequal незначительно отличается от eq и ne. isequal метод требует, чтобы два сравниваемых значения были одного размера. Поэтому isequal возвращает значение false при сравнении массива перечисления с char вектор или строковый скаляр, даже если текст совпадает с одним из элементов перечисления в массиве.

wd = [WeekDays.Monday WeekDays.Wednesday WeekDays.Friday];
isequal(wd,"Friday")
ans =

     logical

     0

Перечисления в switch Заявления

Равенство (eq) и неравенство (ne) функции позволяют использовать элементы перечисления в switch заявления. Например, использование WeekDays перечисление, определенное ранее, создайте инструкцию switch:

function c = Reminder(day)
   % Add error checking here
   switch(day)
      case WeekDays.Monday
         c = 'No meetings';
      case WeekDays.Tuesday
         c = 'Department meeting at 10:00';
      case {WeekDays.Wednesday WeekDays.Friday}
         c = 'Team meeting at 2:00';
      case WeekDays.Thursday
         c = 'Volleyball night';
   end
end

Передача элемента WeekDays класс перечисления в Reminder функция:

today = WeekDays.Wednesday;
Reminder(today)
ans =

Team meeting at 2:00

Дополнительные сведения см. в разделе Объекты в условных операторах.

Подстановочные строки или char Векторы

Можно использовать строки или char векторы для представления конкретных элементов перечисления:

function c = Reminder2(day)
   switch(day)
      case 'Monday'
         c = 'Department meeting at 10:00';
      case 'Tuesday'
         c = 'Meeting Free Day!';
      case {'Wednesday' 'Friday'}
         c = 'Team meeting at 2:00';
      case 'Thursday'
         c = 'Volleyball night';
   end
end

Хотя вы можете использовать char вместо явного указания перечислений, MATLAB ® должен преобразовать текстовый формат в перечисление. Устраните необходимость в этом преобразовании, если в этом нет необходимости.

Членство в наборе перечислений

Классы перечисления предоставляют методы для определения членства в наборе.

  • ismember - True для элементов массива перечисления, если в наборе

  • setdiff - Установить разницу для массивов перечисления

  • intersect - Установка пересечения для массивов перечисления

  • setxor - Задать исключающее или для массивов перечисления

  • union - Установка объединения для массивов перечисления

Определите, является ли сегодняшний день днем встречи для вашей команды. Создайте набор членов перечисления, соответствующий дням, в которые участники коллектива проводят собрания.

today = WeekDays.Tuesday;
teamMeetings = [WeekDays.Wednesday WeekDays.Friday];

Использовать ismember чтобы определить, today является частью teamMeetings набор:

ismember(today,teamMeetings)
ans = 
     0

Смешанные наборы перечисления и текста

Если передать как элементы перечисления, так и текстовые значения методу класса перечисления, класс попытается преобразовать текстовое значение в класс перечисления.

Определите, char вектор 'Friday' является членом массива перечисления.

teamMeetings = [WeekDays.Wednesday WeekDays.Friday];
ismember('Friday',teamMeetings)
ans =

  logical

   1

Определите, является ли элемент перечисления членом строкового массива.

ismember(WeekDays.Friday,["Wednesday" "Friday"])
ans =

  logical

   1

Методы сравнения текста перечисления

Классы перечисления предоставляют методы для сравнения элементов перечисления с текстом. Одним из аргументов методов сравнения строк должен быть char вектор или строка. Сравнение двух возвращаемых элементов перечисления false.

  • strcmp - Сравнить элементы перечисления

  • strncmp - Сравнение первых n символов элементов перечисления

  • strcmpi - Сравнение элементов перечисления без учета регистра

  • strncmpi - Нечувствительное к регистру сравнение первых n символов элементов перечисления

Сравнение элемента перечисления со строками или char Векторы

Методы сравнения строк могут сравнивать элементы перечисления с char векторы и строки.

today = WeekDays.Tuesday;
strcmp(today,'Friday')
ans =

     0
strcmp(today,"Tuesday")
ans =

     1

Получение сведений о перечислениях

Получение информации о классах перечисления с помощью enumeration функция. Например:

enumeration WeekDays
Enumeration members for class 'WeekDays':

    Monday
    Tuesday
    Wednesday
    Thursday
    Friday

Дополнительные сведения о том, как интроспекция классов работает с перечислениями, см. в разделе Свойство Metaclass EnumeriveValues.

Тестирование перечисления

Чтобы определить, является ли значение перечислением, используйте isenum функция. Например:

today = WeekDays.Wednesday;
isenum(today)
ans =

     1

isenum прибыль true для пустых объектов перечисления:

noday = WeekDays.empty;
isenum(noday)
ans =

     1

Чтобы определить, является ли класс классом перечисления, используйте meta.class объект.

today = WeekDays.Wednesday;
mc = metaclass(today);
mc.Enumeration
ans =

     1

Связанные темы