ハンドル オブジェクトの配列の初期化
ハンドル オブジェクトの配列を初期化する際、MATLAB® は配列の空要素を既定のオブジェクトで埋めます。既定のオブジェクトを作成するため、MATLAB は以下を行います。
クラス コンストラクターを一度呼び出してオブジェクトを取得する
配列の各要素に一意のハンドルを作成する
コンストラクターを再度呼び出さずに、構築された既定のオブジェクトからプロパティ値をコピーする
InitHandleArray
クラスによってこの動作が示されています。
classdef InitHandleArray < handle properties RandNumb end methods function obj = InitHandleArray obj.RandNumb = randi(100); end end end
RandNumb
プロパティには InitHandleArray
コンストラクターが代入する乱数が含まれています。
配列の最後の要素への代入によって作成された配列を MATLAB が初期化すると、何が起こるかを考えてみます (最後の要素は、インデックス値が最も大きい要素です)。要素 A(4,5)
に代入されている InitHandleArray
オブジェクトの RandNumb
プロパティの値が 59
であるとします。
A(4,5) = InitHandleArray; A(4,5).RandNumb
ans = 59
インデックス A(4,5)
の位置にある要素は、InitHandleArray
クラスのインスタンスです。要素 A(1,1)
で使用されている既定のオブジェクトも InitHandleArray
クラスのインスタンスですが、その RandNumb
プロパティは別の乱数に設定されています。
先行の配列要素を埋めるため、MATLAB はクラス コンストラクターを呼び出して 1 つのオブジェクトを作成します。MATLAB はこのオブジェクトを残りのすべての配列要素にコピーします。コンストラクターを呼び出して既定のオブジェクトを作成した結果、関数 randi
の呼び出しがもう 1 回行われ、新しい乱数が返されます。
A(1,1).RandNumb
ans = 10
MATLAB はこの 2 番目のインスタンスの値を配列の残りのすべての要素にコピーします。
A(2,2).RandNumb
ans = 10
A(2,3).RandNumb
ans = 10
オブジェクト配列を初期化するとき、MATLAB は単一のオブジェクトのコピーを配列の空の要素に割り当てます。MATLAB は、後から各オブジェクトに異なるプロパティ値を代入できるよう、各オブジェクトに一意のハンドルを付与します。各オブジェクトは等価ではありません。
A(1,1) == A(2,2)
ans = 0
すなわち、ハンドル A(1,1)
は A(2,2)
と同じオブジェクトを参照しないということです。次のようなステートメントで配列を作成すると、
A(4,5) = InitHandleArray;
クラス コンストラクターが 2 回呼び出されます。最初の呼び出しでは、配列要素 A(4,5)
のオブジェクトが作成されます。2 回目の呼び出しでは、MATLAB により残っている空の配列要素すべてにコピーされる、既定のオブジェクトが作成されます。
関連情報
配列操作の詳細については、多次元配列を参照してください。
値をプロパティに割り当てる方法の詳細は、既定のプロパティ値としてのオブジェクトの処理を参照してください。
クラスに対して subsasgn
メソッドを実装する方法の詳細は、オブジェクトのインデックス付けのカスタマイズを参照してください。