Main Content

枚举的运算

枚举支持的运算

您可以对枚举使用逻辑、集合关系和字符串比较运算。这些运算还支持在条件语句中使用枚举,例如 switchif 语句。stringchar 函数使您能够将枚举成员转换为字符串和 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 向量的关系运算

您可以使用关系运算符 eq (==) 和 ne (~=) 以及 isequal 方法将枚举实例与 char 向量和字符串进行比较。

关系运算符 eqne

使用 eqne 将枚举成员与文本值进行比较。例如,您可以将枚举成员与字符串进行比较:

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 的行为与 eqne 略有不同。isequal 方法要求所比较的两个值大小相同。因此,将枚举数组与 char 向量或字符串标量进行比较时,isequal 返回 false,即使文本与数组中的一个枚举成员匹配也是如此。

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

有关详细信息,请参阅Objects in Conditional Statements

代替字符串或 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 EnumeratedValues Property

对枚举的测试

要确定某值是否为枚举,请使用 isenum 函数。例如:

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

     1

对于空枚举对象,isenum 返回 true

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

     1

要确定某个类是否为枚举类,请使用 matlab.metadata.Class 对象。

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

     1

相关主题