オブジェクトのコピー
2 つのコピーの動作
MATLAB® の基本的なオブジェクトには、ハンドルと値の 2 種類があります。
"値" オブジェクトは、コピー操作において MATLAB 基本型のように動作します。コピーは、それぞれ独立した値です。1 つのオブジェクトに操作を実行しても、そのオブジェクトのコピーには影響しません。
"ハンドル" オブジェクトは、ハンドル変数により参照されます。ハンドル変数のコピーは同じオブジェクトを参照します。ハンドル オブジェクトに対して実行する操作は、そのオブジェクトを参照するすべてのハンドル変数から参照することができます。
ハンドル オブジェクトのコピー
クラスを定義する場合で、ハンドル オブジェクトのコピーをサポートするときは、ハンドル クラスのコピーの実装を参照してください。
値オブジェクトのコピーの動作
MATLAB の数値変数は値オブジェクトです。たとえば、a
を変数 b
にコピーしても、両方の変数は互いに独立です。a
の値を変更しても b
の値は変わりません。
a = 8; b = a;
a
に再代入します。b
は変わりません。
a = 6; b
b = 8
a
を変更しても、b
には影響しません。
clear a
b
b = 8
値オブジェクトのプロパティ
値オブジェクトにプロパティとして格納されている値のコピーの動作は、数値変数と同様です。たとえば、vobj1
は、プロパティ a
をもつ値オブジェクトであるとします。
vobj1.a = 8;
vobj1
を vobj2
にコピーした後 vobj1
のプロパティ a
の値を変更しても、コピーされたオブジェクトのプロパティの値 vobj2.a
には影響しません。
vobj2 =vobj1; vobj1.a = 5; vobj2.a
ans = 8
ハンドル オブジェクトのコピーの動作
次に示すのは、Data
というプロパティを定義する HdClass
というハンドル クラスです。
classdef HdClass < handle properties Data end methods function obj = HdClass(val) if nargin > 0 obj.Data = val; end end end end
このクラスのオブジェクトを作成します。
hobj1 = HdClass(8)
このステートメントはセミコロンで終わらないので、MATLAB によってオブジェクトに関する情報が表示されます。
hobj1 = HdClass with properties: Data: 8
変数 hobj1
は、作成されたオブジェクトを参照するハンドルです。hobj1
を hobj2
にコピーすると、同じオブジェクトを参照する別のハンドルになります。
hobj2 = hobj1
hobj2 = HdClass with properties: Data: 8
ハンドルはオブジェクトを参照するので、ハンドルをコピーすると新しい変数名へハンドルがコピーされますが、ハンドルは引き続き同じオブジェクトを参照します。たとえば、hobj1
がプロパティ Data
をもつハンドル オブジェクトだとします。
hobj1.Data
ans = 8
hobj1
の Data
プロパティの値が変化し、コピーされたオブジェクトの Data
プロパティの値も変化します。
hobj1.Data = 5; hobj2.Data
ans = 5
hobj2
と hobj1
は同じオブジェクトに対するハンドルなので、コピーである hobj2
を変更すると、ハンドル hobj1
を介してアクセスするデータも変化します。
hobj2.Data = 17; hobj1.Data
ans = 17
ハンドル変数の再代入
ハンドル変数を再代入すると、他の MATLAB 変数を再代入する場合と同じ結果になります。オブジェクトを作成して hobj1
に代入するには、次のようにします。
hobj1 = HdClass(3.14);
hobj1
では、以前に参照していた同じオブジェクトではなく、新規のオブジェクトが参照されます。なお、hobj2
では引き続き以前のオブジェクトが参照されます。
ハンドル変数のクリア
ワークスペースからハンドルをクリアすると、MATLAB はその変数を削除しますが、別のハンドルによって参照されるオブジェクトは削除しません。ただし、オブジェクトへの参照がない場合、MATLAB はオブジェクトを破棄します。
同じオブジェクトを参照する hobj1
と hobj2
が与えられた場合に、オブジェクトに影響せずにいずれかのハンドルをクリアすることができます。
hobj1.Data = 2^8; clear hobj1 hobj2
hobj2 = HdClass with properties: Data: 256
hobj1
と hobj2
の両方をクリアすると、オブジェクトに対する参照がなくなります。MATLAB はオブジェクトを破棄し、そのオブジェクトで使用されるメモリを解放します。
ハンドル オブジェクトの削除
任意数のハンドルで参照されるオブジェクトを削除するには、delete
を使用します。同じオブジェクトを参照する hobj1
と hobj2
が与えられた場合に、いずれかのハンドルを削除します。MATLAB はオブジェクトを削除します。
hobj1 = HdClass(8); hobj2 = hobj1; delete(hobj1) hobj2
hobj2 = handle to deleted HdClass
ワークスペースから変数を削除するには、clear
を使用します。
オブジェクトの変更
オブジェクトを関数に渡すと、MATLAB はオブジェクトのコピーを関数ワークスペースに渡します。関数がオブジェクトを変更する場合、MATLAB は関数ワークスペース内のオブジェクトのコピーのみを変更します。次のような場合、ハンドル クラスと値クラス間でのコピー動作の違いは重要です。
値オブジェクト — 関数は、オブジェクトの変更されたコピーを返さなければなりません。呼び出し側ワークスペースのオブジェクトを変更するには、関数の出力を同じ名前の変数に代入します。
ハンドル オブジェクト — 関数ワークスペース内のコピーは同じオブジェクトを参照します。したがって、関数は変更されたオブジェクトを返す必要はありません。
ハンドル クラスまたは値クラスの判定
オブジェクトがハンドル オブジェクトかどうかを判定するには、関数 isa
を使用します。obj
があるクラスのオブジェクトの場合、次のステートメントは obj
がハンドルかどうかを判定します。
isa(obj,'handle')
たとえば、containers.Map
クラスは、ハンドル オブジェクトを作成します。
hobj = containers.Map({'Red Sox','Yankees'},{'Boston','New York'}); isa(hobj,'handle')
ans = 1
hobj
も containers.Map
オブジェクトです。
isa(hobj,'containers.Map')
ans = 1
hobj
のクラスをクエリすると containers.Map
オブジェクトであることがわかります。
class(hobj)
ans = containers.Map
関数 class
はオブジェクトの特定のクラスを返します。