枚举的运算
枚举支持的运算
您可以对枚举使用逻辑、集合关系和字符串比较运算。这些运算还支持在条件语句中使用枚举,例如 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
向量的关系运算
您可以使用关系运算符 eq
(==
) 和 ne
(~=
) 以及 isequal
方法将枚举实例与 char
向量和字符串进行比较。
关系运算符 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
方法要求所比较的两个值大小相同。因此,将枚举数组与 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® 必须将文本格式转换为枚举。如果没有必要,就不需要进行这种转换。
枚举集合关系
枚举类提供用于确定集合关系的方法。
确定今天是否为您的团队开会的日期。创建一组对应于团队开会日期的枚举成员。
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
。
将枚举成员与字符串或 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
要确定某个类是否为枚举类,请使用 meta.class
对象。
today = WeekDays.Wednesday; mc = metaclass(today); mc.Enumeration
ans = 1