可変ハンドルと不変値の列挙メンバー
ハンドルベースまたは値ベースの列挙型の選択
時間が経つにつれ状態が変化する可能性のあるオブジェクトのセットを列挙する場合は、ハンドル列挙型を使用します。値列挙型を使用して、抽象的 (かつ不変の) 値のセットを列挙します。ハンドル クラスと値クラスの詳細については、ハンドル クラスと値クラスの比較を参照してください。
値ベースの列挙クラス
値ベースの列挙クラスは固定されたセットの特定の値をもっています。プロパティの値を変更してこれらの値を変更します。そうすることで、この列挙クラスに対し固定された一連の値が拡張されるか変更されます。
継承されるプロパティ SetAccess は不変でなければならない
値ベースの列挙クラスは暗黙のうちにすべてのプロパティの SetAccess 属性を immutable として定義します。SetAccess 属性を他のいかなる値にも設定できません。
ただし、すべてのスーパークラス プロパティはプロパティ SetAccess を immutable として明示的に定義しなければなりません。
列挙メンバーは不変
値ベースの列挙クラスのインスタンスは、クラスがクリアされて再読み込みされるまで一意です。たとえば、次のクラスがあるとします。
classdef WeekDays enumeration Monday, Tuesday, Wednesday, Thursday, Friday end end
MATLAB® は a と b を同等に考慮します。
a = WeekDays.Monday; b = WeekDays.Monday; isequal(a,b)
ans =
1a == b
ans =
1
列挙メンバーのプロパティは不変
プロパティを定義する値ベースの列挙クラスは不変です。たとえば、Colors 列挙クラスは RGB 値をカラー名と関連付けます。
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
コンストラクターは入力引数をプロパティ R、G、および B に割り当てます。
red = Colors.Red; [red.R,red.G,red.B]
ans =
1 0 0プロパティ値を変更することはできません。
red.G = 1;
You cannot set the read-only property 'G' of Colors.
ハンドルベースの列挙クラス
プロパティを定義するハンドルベースの列挙クラスは可変です。クラスのインスタンスでプロパティ値を変更できるようにしなければならない場合は、列挙クラスを handle クラスから派生させます。
メモ
列挙クラスを matlab.mixin.Copyable から派生させることはできません。作成できるインスタンス数は列挙型ブロック内で定義された数に制限されるためです。
列挙メンバーは不変
プロパティをもつハンドルベースの列挙クラスの場合は、インスタンスのプロパティ値を変更すると、変更された値がそれを参照するすべてのインスタンスに反映されます。
たとえば、HandleColors 列挙クラスは RGB 値を前例の Colors クラスと同じカラー名に関連付けます。ただし、HandleColors は handle から派生します。
classdef HandleColors < handle properties R = 0 G = 0 B = 0 end methods function c = HandleColors(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
HandleColors.Red のインスタンスを作成し、プロパティ R の値を返します。
a = HandleColors.Red; a.R
ans =
1
MATLAB は HandleColors.Red 列挙メンバーを作成します。これは、プロパティ R を 1 に、プロパティ G を 0 に、プロパティ B を 0 に設定します。
プロパティ R の値を 0.8 に変更します。
a.R = 0.8;
プロパティ R の値を 0.8 に設定後、HandleColors.Red のもうひとつのインスタンス b を作成します。
b = HandleColors.Red; b.R
ans =
0.8000また、新しく作成されたインスタンスの R プロパティの値は 0.8 です。MATLAB セッションは常にどの列挙メンバーに対しても値を 1 つだけもちます。
ワークスペース変数をクリアしても、列挙メンバー HandleColors.Red の現在の定義は変わりません。
clear a = HandleColors.Red; a.R
ans =
0.8000HandleColors クラスの定義を再読み込みするために、クラスをクリアします。
clear classes
a = HandleColors.Red;
a.R
ans =
1与えられたプロパティ値の再割り当てを回避するには、そのプロパティの SetAccess 属性を immutable に設定します。
ハンドルベースの列挙型の等式
2 つの変数を特定の列挙メンバーに割り当てます。
a = HandleColors.Red; b = HandleColors.Red;
isequal を使用して a と b を比較します。
isequal(a,b)
ans =
1a と b のプロパティ値は同じです。そのため、isequal は true を返します。ただし、列挙クラスではないハンドル クラスとは異なり、列挙メンバーは 1 つだけなので a と b は同じハンドルです。== (ハンドル eq メソッド) を使用して、ハンドル等式を決定します。
a == b
ans =
1ハンドルと併用するときに isequal と == がどのように異なるかの詳細については、handle eq メソッドを参照してください。
列挙型を使用して状態を表す
MachineState クラスは 2 つの列挙メンバーを定義して、マシンの稼動中と停止中の状態を表します。
classdef MachineState enumeration Running NotRunning end end
Machine クラスは起動と停止の操作でマシンを表します。eq と char メソッドにより MachineState 列挙型の使用は簡単になり、その結果コードも読みやすくなります。
classdef Machine < handle properties (SetAccess = private) State = MachineState.NotRunning end methods function start(machine) if machine.State == MachineState.NotRunning machine.State = MachineState.Running; end disp (machine.State.char) end function stop(machine) if machine.State == MachineState.Running machine.State = MachineState.NotRunning; end disp (machine.State.char) end end end
Machine オブジェクトを作成し、start と stop メソッドを呼び出します。
m = Machine; m.start
Running
m.stop
NotRunning