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

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

Можно использовать логический, членство в наборе и операции сравнения строк на перечислениях. Эти операции также поддерживают использование перечислений в условных операторах, такой как 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 — Верный для элементов массива перечисления, если в наборе

  • 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

Для получения дополнительной информации о том, как самоанализ класса работает с перечислениями, смотрите Метакласс Свойство EnumeratedValues.

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

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

Похожие темы