1. ä½ å¯ä»¥å¾å°ä¸æ°åMATLABçç±»çå½æ°ï¼
classdef (Sealed) Colors
properties (Constant)
RED = 1;
GREEN = 2;
BLUE = 3;
end
methods (Access = private) % private so that you cant instantiate
function out = Colors
end
end
end
è¿æ¯ä¸æ¯ä¸ä¸ªçæ£çç±»åï¼ä½ç±äºMATLABæ¯å¼±ç±»åï¼å¦ææ´æ°ï¼ä½ å¯ä»¥åçäºæ
ï¼å®è¿ä¼¼ï¼
line1 = Colors.RED;
...
if Colors.BLUE == line1
end
å¨è¿ç§æ
åµä¸ï¼MATLABâenumsâæ¯æ¥è¿Cæ ·å¼enums-为æ´æ°ä»£æ¿è¯æ³ã
éçä½ çè³å¯ä»¥ä½¿MATLABçenumsæ¥è¿é¿è¾¾å¨å¤æï¼ä½ä¸å¹¸çæ¯ä¸awkçè¯æ³ã
2.
ä»R2010bä¸å¼å§ CodeGo.netï¼MATLABæ¯æ
ä»ç¤ºä¾
classdef Colors
properties
R = 0;
G = 0;
B = 0;
end
methods
function c = Colors(r, g, b)
c.R = r; c.G = g; c.B = b;
end
end
enumeration
Red (1, 0, 0)
Green (0, 1, 0)
Blue (0, 0, 1)
end
end
3.
ä½ å¯ä»¥ä»ä½ çMatlab代ç Javaçenumsç±»ãå®ä¹å®ä»¬å¨Javaä¸ï¼å¹¶æå®ä»¬æ¾å¨ä½ çMatlabçjavaclasspathã
// Java class definition
package test;
public enum ColorEnum {
RED, GREEN, BLUE
}
æ¨å¯ä»¥å¨M-代ç ä¸å¼ç¨å®ä»¬éè¿ã
mycolor = test.ColorEnum.RED
if mycolor == test.ColorEnum.RED
disp('got red');
else
disp('got other color');
end
% Use ordinal() to get a primitive you can use in a switch statement
switch mycolor.ordinal
case test.ColorEnum.BLUE.ordinal
disp('blue');
otherwise
disp(sprintf('other color: %s', char(mycolor.toString())))
end
å®ä¸ä¼å¯¹å
¶ä»ç±»åçï¼è½ç¶ãå符串æä¸ä¸ªå¥æªçåæ¥å¤§å°ã
>> test.ColorEnum.RED == 'GREEN'
ans =
0
>> test.ColorEnum.RED == 'RED'
ans =
1 1 1
4.
å¦æä½ æ³è¦å类似äºé©¬å
建议ï¼æ¨å¯ä»¥ç´æ¥ä½¿ç¨ä¸ä¸ªç»ææ¥è¡¨ç¤ºä½ çç±»åï¼èä¸æ¯ä¸ä¸ªå
¨æ°çç±»ï¼
colors = struct('RED',1,'GREEN',2,'BLUE',3);
ä¸ä¸ªå¥½å¤æ¯ï¼ä½ å¯ä»¥è½»æ¾å°è®¿é®ç»æ两ç§ä¸åçæ¹å¼ãæ¨å¯ä»¥æå®ä¸ä¸ªåçå
a = colors.RED;
æè
ä½ å
满活åçé¢åï¼å¦æä½ æä¸ä¸ªå符串å段ï¼
a = colors.('RED');
äºå®ä¸ï¼æå 个好å¤ï¼åä»ä¹é©¬å
建议ï¼åé ä¸ä¸ªå
¨æ°çç±»æ¥è¡¨ç¤ºä¸ä¸ªâenumsâ对象ï¼
æ¨å¯ä»¥æ§å¶å¦ä½å¨å¯¹è±¡è¢«ä¿®æ¹ã
ä½ å¯ä»¥æå®ä¹å¨ä¸ä¸ªå°æ¹ï¼å®å¨å¤ä¸ªå°æ¹ã
æ¨å¯ä»¥æ§å¶ç失败ï¼ä½¿ä»ä»¬æ´âä¼é
âï¼åè¿åä¸ä¸ªç©ºç©éµï¼å¦æä½ è¯å¾è®¿é®ä¸ä¸ªä¸åå¨çå段ï¼èä¸æ¯æåºä¸ä¸ªé误ï¼ã
ä½æ¯ï¼å¦æä½ ä¸éè¦é£ç§ï¼åªæ¯éè¦åçå¿«ï¼ç»æå¾å¯è½æ¯æç®åï¼æç´æ¥çå®ä¹å°ä¸æ§çæ¬çMATLABçå·¥ä½ï¼åâææ°çOOP
5.
å
¶å®æ¯å¨MATLAB R2009bå
³é®åå«å'ãè¿ä¼¼ä¹æ¯ï¼æä¸è½è¯´æç¥éæ¯æä¹åäºï¼ä½å½æ°å´å¯è½åå¨ã
ä½ å¯ä»¥æ¾å°å®å¨matlabroot\toolbox\distcomp\examples\+examplesclassdef(Enumeration) DmatFileMode < int32
enumeration
ReadMode(0)
ReadCompatibilityMode(1)
WriteMode(2)
end
<snip>
end
6.
ä½ å¯ä»¥åä¸ä¸ªmatlabçç±»ï¼å®çè¡ä¸ºå°±åä¸ä¸ªJavaçèç±»åå®å
¨enums模å¼ã马å
ç解å³æ¹æ¡çä¿®æ¹å¯ä»¥æå®ä»Cæ ·å¼çç±»åå®ä¹ï¼æ´åæ¯Javaæ ·å¼çç±»åå®å
¨enumsãå¨è¿ä¸ªçæ¬ä¸ï¼å¸¸éçå¼ç±»åé¢è²ç对象ã
æå©çä¸é¢ï¼
该类åå¯ä»¥è¿è¡æ£æ¥ï¼å¨ç±==çæä½ï¼ä»¥é²æ¢å¯¹ççæå
¶ä»ç±»åçenumsã
ä½ å¯ä»¥æç¡®å°æ£æ¥ä½ çåéçç±»åï¼å¨
å¼æ¾ç¤ºä¸å¯è¯»æ§ï¼èä¸æ¯ä¸éæç代ç ã
æä½åstdï¼ï¼ä¸å°±enumsæä¹æ¯ä¸å
许çã
缺ç¹ï¼
è¾é¿çç±»å®ä¹ãä½æ¯ï¼è¿æ¯ææçæ ·æ¿ï¼å¹¶ä¸å¯ä»¥ç¨äºä»»ä½å
¶ä»enumsç±»ï¼åªéæ¹åç±»å常éå±æ§ã
è¿äºenumså¨switchåä¸è½ç´æ¥ãéè¦å¼¹åºç代ç äºï¼å¤±å»äºç±»åå®å
¨ã
对象ä¼æ¯åè¯æ
¢ãç¸å
³çï¼å¦æä½ å¨å¾ªç¯ä¸ç常éã
æ´ä½æ¥è¯´ï¼æä¸ç¥éåªç§æ¹å¼æ´å¥½ãé¿é£æ¸¯âæ 论æ¯å¨å®è·µä¸ã
classdef (Sealed) Color
%COLOR Example of Java-style typesafe enum for Matlab
properties (Constant)
RED = Color(1, 'RED');
GREEN = Color(2, 'GREEN');
BLUE = Color(3, 'BLUE');
end
properties (SetAccess=private)
% All these properties are immutable.
Code;
Name;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
methods (Access = private)
%private so that you can't instatiate directly
function out = Color(InCode, InName)
out.Code = InCode;
out.Name = InName;
end
end
methods (Static = true)
function needa(obj)
%NEEDA Asserts that obj must be a Color
if ~isa(obj, mfilename)
error('Input must be a %s; got a %s', mfilename, class(obj));
end
end
end
methods (Access = public)
function display(obj)
disp([inputname(1) ' =']);
disp(obj);
end
function disp(obj)
if isscalar(obj)
disp(sprintf('%s: %s (%d)', class(obj), obj.Name, obj.Code));
else
disp(sprintf('%s array: size %s', class(obj), mat2str(size(obj))));
end
end
function out = eq(a, b)
%EQ Basic "type-safe" eq
check_type_safety(a, b);
out = [a.Code] == [b.Code];
end
function [tf,loc] = ismember(a, b)
check_type_safety(a, b);
[tf,loc] = ismember([a.Code], [b.Code]);
end
function check_type_safety(varargin)
%CHECK_TYPE_SAFETY Check that all inputs are of this enum type
for i = 1:nargin
if ~isa(varargin{i}, mfilename)
error('Non-typesafe comparison of %s vs. %s', mfilename, class(varargin{i}));
end
end
end
end
end
è¿éæä¸ä¸ªå½æ°æ¥è¡ä½¿å®ã
function do_stuff_with_color(c)
%DO_STUFF_WITH_COLOR Demo use of the Color typesafe enum
Color.needa(c); % Make sure input was a color
if (c == Color.BLUE)
disp('color was blue');
else
disp('color was not blue');
end
% To work with switch statements, you have to explicitly pop the code out
switch c.Code
case Color.BLUE.Code
disp('blue');
otherwise
disp(sprintf('some other color: %s', c.Name));
end
ä¾å
>> Color.RED == Color.RED
ans =
1
>> Color.RED == 1
??? Error using ==> Color>Color.check_type_safety at 55
Non-typesafe comparison of Color vs. double
Error in ==> Color>Color.eq at 44
check_type_safety(a, b);
>> do_stuff_with_color(Color.BLUE)
color was blue
blue
>> do_stuff_with_color(Color.GREEN)
color was not blue
some other color: GREEN
>> do_stuff_with_color(1+1) % oops - passing the wrong type, should error
??? Error using ==> Color>Color.needa at 26
Input must be a Color; got a double
Error in ==> do_stuff_with_color at 4
Color.needa(c); % Make sure input was a color
>>
Aå°è°æªçç两ç§æ¹æ³ï¼æ常æ°ä¸çâ==âï¼ä»¥é²æ¢ä¸è¯å·¦æçC约å®ä¸å¸®å©å°½å¯è½å¤çå¨è¿éãå¨Matlabä¸ï¼å¦æä½ â=âç¨è¿ä¸ªå¸¸æ°ï¼èä¸æ¯ä¸ä¸ªé误å¨LHSï¼ä½åªéè¦å»ºç«ä¸ä¸ªæ°çå±é¨ç»æåéçé¢è²ï¼å®ä¼æ©çenumsç±»ã
>> Colors.BLUE = 42
Colors =
BLUE: 42
>> Color.BLUE = 42
Color =
BLUE: 42
>> Color.RED
??? Reference to non-existent field 'RED'.
7.
å¨å°è¯äºè¿ä¸ªé¡µé¢ä¸çå
¶ä»å»ºè®®ï¼æéè½å¨å®å¾·é²çå®å
¨é¢å对象çæ¹æ³ãå¾ä¸éç-æè°¢å®å¾·é²ã
ä¸ä¸æ人æå
´è¶£ï¼ä¸è¿ï¼æåäºï¼æ认为æ¯ï¼ç¹å«æ¯ï¼æå é¤äºéè¦åå»æå®çenums对象ãå¨ç°å¨æ¯åæåç³»ç»ãæ¤å¤ï¼å¼ï¼ï¼åå½æ°è¿è¡äºéæ°ç¼åï¼ä»¥å
é¦ä¸ºenums对象çç©éµå¦¥åå½¢çè¿åå¼ãæåï¼check_type_safetyï¼ï¼å½æ°è¿è¡äºä¿®æ¹ï¼ä½¿ä¸å
çç®å½ï¼ä¾å¦ï¼
ä¼¼ä¹å¾å¥½å°å·¥ä½ï¼ä½ç¥éä½ å¨æ³ä»ä¹ï¼
classdef (Sealed) Color
%COLOR Example of Java-style typesafe enum for Matlab
properties (Constant)
RED = Color(1);
GREEN = Color(2);
BLUE = Color(3);
end
methods (Access = private) % private so that you can''t instatiate directly
function out = Color(InCode)
out.Code = InCode;
end
end
% ============================================================================
% Everything from here down is completely boilerplate - no need to change anything.
% ============================================================================
properties (SetAccess=private) % All these properties are immutable.
Code;
end
properties (Dependent, SetAccess=private)
Name;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
methods
function out = eq(a, b) %EQ Basic "type-safe" eq
check_type_safety(a, b);
out = reshape([a.Code],size(a)) == reshape([b.Code],size(b));
end
function [tf,loc] = ismember(a, b)
check_type_safety(a, b);
[tf,loc] = ismember(reshape([a.Code],size(a)), [b.Code]);
end
function check_type_safety(varargin) %CHECK_TYPE_SAFETY Check that all inputs are of this enum type
theClass = class(varargin{1});
for ii = 2:nargin
if ~isa(varargin{ii}, theClass)
error('Non-typesafe comparison of %s vs. %s', theClass, class(varargin{ii}));
end
end
end
% Display stuff:
function display(obj)
disp([inputname(1) ' =']);
disp(obj);
end
function disp(obj)
if isscalar(obj)
fprintf('%s: %s (%d)\n', class(obj), obj.Name, obj.Code);
else
fprintf('%s array: size %s\n', class(obj), mat2str(size(obj)));
end
end
function name=get.Name(obj)
mc=metaclass(obj);
mp=mc.Properties;
for ii=1:length(mp)
if (mp{ii}.Constant && isequal(obj.(mp{ii}.Name).Code,obj.Code))
name = mp{ii}.Name;
return;
end;
end;
error('Unable to find a %s value of %d',class(obj),obj.Code);
end;
end
end
谢谢ï¼
ç³å
8.
å¦ææ¨å¯ä»¥è®¿é®ç»è®¡å·¥å
·ç®±ï¼ä½ å¯è½ä¸ä¸ªæç¡®ç对象ã
9.
Toys = {'Buzz', 'Woody', 'Rex', 'Hamm'};
Toys{3}
ans = 'Rex'
10.
å¦æä½ éè¦çç±»ååªæ¯ä¼ éå°Cï¼æ.NETç¨åºéï¼
æ¨å¯ä»¥æ建并éè¿ä½¿ç¨MATLAB 2010enumsï¼
A = NET.addAssembly(MyName.dll)
% suppose you have enum called "MyAlerts" in your assembly
myvar = MyName.MyAlerts.('value_1');
æ¨ä¹å¯ä»¥æ£æ¥MathWorkså
¬å¸æ£å¼å¨çæ¡
æä¹åçãå¨MATLAB 7.8 NETçå¼ï¼R2009aï¼ï¼
// the enum "MyAlerts" in c# will look something like this
public enum MyAlerts
{
value_1 = 0,
value_2 = 1,
MyAlerts_Count = 2,
}
温馨提示:答案为网友推荐,仅供参考