可変ハンドルと不変値の列挙メンバー
ハンドルベースまたは値ベースの列挙型の選択
時間が経つにつれ状態が変化する可能性のあるオブジェクトのセットを列挙する場合は、ハンドル列挙型を使用します。値列挙型を使用して、抽象的 (かつ不変の) 値のセットを列挙します。ハンドル クラスと値クラスの詳細については、ハンドル クラスと値クラスの比較を参照してください。
値ベースの列挙クラス
値ベースの列挙クラスは固定されたセットの特定の値をもっています。プロパティの値を変更してこれらの値を変更します。そうすることで、この列挙クラスに対し固定された一連の値が拡張されるか変更されます。
継承されるプロパティ 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 = 1
a == 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.8000
HandleColors
クラスの定義を再読み込みするために、クラスをクリアします。
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 = 1
a
と 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