目录
枚举的运算
枚举支持的运算
可以对枚举使用逻辑、集合关系和字符串比较运算。这些运算还允许在条件语句中使用枚举,例如switch和if语句。转换器能够使用 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 向量的元胞数组或string 数组元素转换为枚举。当与枚举结合使用时,其他方法的行为与等效函数的类似。
将枚举成员转换为字符
转换为 char 非常有用,因为可以用描述性名称定义枚举成员。例如:
today = WeekDays.Friday;
['Today is ',char(today)]
ans =
Today is Friday
将枚举数组转换为字符向量元胞数组
使用cellstr 将枚举数组转换为 char 向量元胞数组。
ca = cellstr([WeekDays.Tuesday,WeekDays.Thursday]);
class(ca)
ans =
cell
元胞数组中的两个元胞都包含 char 向量:
class([ca{1:2}])
ans =
char
关系运算中的枚举和字符向量
对于涉及关系运算符eq和ne的表达式,如果其中一个操作数是枚举,则允许另一个操作数为 char 类型。在执行运算之前,MATLAB® 将 char 向量转换为枚举标量,或将 char 向量元胞数组转换为枚举数组。
注意:从 MATLAB 内置类派生的枚举类不能用 char 向量代替枚举成员。
today = WeekDays.Friday;
today == 'Friday'
ans =
1
将枚举数组与 char 向量进行比较:
wd = [WeekDays.Monday,WeekDays.Wednesday,WeekDays.Friday];
wd == 'Friday'
ans =
0 0 1
将枚举数组与 char 向量元胞数组进行比较:
cv = {'Monday','Wednesday','Friday'};
md = [WeekDays.Tuesday,WeekDays.Thursday,WeekDays.Friday];
md ~= cv
ans =
1 1 0
char 向量 Wednesday 等于 (==) 枚举成员 WeekDays.Wednesday。可以在条件语句中使用此相等性:
today = 'Wednesday';
...
if today == WeekDays.Wednesday
disp('Team meeting at 2:00')
end
switch
语句中的枚举
相等 (eq) 和不相等 (ne) 方法能够在switch语句中使用枚举成员。例如,使用前面定义的 WeekDays 类构造 switch 语句:
function c = Reminder(day)
% Add error checking here
switch(day)
case WeekDays.Monday
c = 'Department meeting at 10:00';
case WeekDays.Tuesday
c = 'Meeting Free Day!';
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
向量
注意:从 MATLAB 内置类派生的枚举类不能用 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 必须将 char 转换为枚举。如果没有必要,就不需要进行这种转换。
枚举集合关系
枚举类提供用于确定集合关系的方法。
-
isemenber - 如果枚举数组的元素在集合中,则为 true
-
setdiff - 枚举数组的差集
-
intersect - 枚举数组的交集
-
setxor - 枚举数组的异或集
-
union - 枚举数组的并集
确定今天是否为团队开会的日期。创建一组对应于团队开会日期的枚举成员。
today = WeekDays.Tuesday;
teamMeetings = [WeekDays.Wednesday WeekDays.Friday];
使用ismember确定 today 是否属于 teamMeetings 集合:
ismember(today,teamMeetings)
ans =
0
枚举和 char
的混合集
如果将枚举和 char 参数都传递给枚举类方法,则该类会尝试将 char 转换为枚举的类。确定 char 向量是否为枚举数组的成员。
teamMeetings = [WeekDays.Wednesday WeekDays.Friday];
ismember('Friday',teamMeetings)
ans =
1
确定枚举成员是否为 char 向量元胞数组的成员。
ismember(WeekDays.Friday,{'Wednesday','Friday'})
ans =
1
枚举的文本比较方法
枚举类提供将枚举成员与 char 向量进行比较的方法。字符串比较方法的参数之一必须为 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
对枚举的测试
要确定某变量是否为枚举,请使用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