動的オブジェクトのリスト

Mops既定クラスの中で,複数の動的オブジェクトを格納するコンテナとして準備されているのがHandleListです。名前の通り、ヒープオブジェクトのハンドルのリストを管理します。また名前と異なり、単なるHandleクラスのリスト版ではなく、Objhandleのリスト版といえます。iMopsでは、Object_Listが、ほぼ同じように利用できます。

HandleListには現行要素(Current Element)という観念があります。HandListに送られるメッセージは、リスト固有のものを除けば、現行要素となっているObjhandleに対して送られます。

要素の追加

リストに新しく動的オブジェクトを追加するには、Objhandleに対する場合と同様の"NewObj:"メッセージを使います。
HandleList   MyObjList
'   MyClass   NewObj:   MyObjList \ ワード定義内では、「'」ではなく「[']」を使う

classXTが引数になります。上のようにすればMyClassのインスタンスがヒープオブジェクトとして生成され、そのハンドルがリストに登録されます。新しいオブジェクトの追加直後は、その追加されたオブジェクトが現行要素になります。このメッセージを繰り返す毎に、新しい要素がリストに追加されていきます。個数には内在的な制限はありません(利用可能なメモリー次第)。

リスト全体の現在の要素数を知るには、SIZE:メッセージを送れば、項目数がスタックに返されます。
SIZE:    myObjList    \ SIZE:  ( -- n )

リストの各要素

リストのインデックスは0ベースです。つまり、最初に追加した要素が第0要素になります。ですから、最後に追加した要素のインデックスは第"SIZE -1"要素となります。

現行要素のインデックス値を知るには、Current:メッセージを送ります。
Current:   MyObjList    \ Current:   ( -- n )

現行要素であるオブジェクトにメッセージを送るやり方はObjhandleの場合と全く同じです。Early Bindなら、
OBJ:   MyObjList   Get:   class_as>   MyClass

のようになります。リストの要素であるオブジェクトにメッセージを送る場合は、あたかも現行のObjHandle単独のオブジェクトであるかのように考えることができます。

ObjHandleの場合と同様、OBJ:メソッドは、オブジェクトをハイメモリに移動してロックします。Unlock:についても同じ考え方が当てはまります。

現行の要素を変更するには、現行要素にしたい要素のインデックス値を用いてSelect:します。
2  Select:  MyObjList    \ Select:  ( n -- )

これで、第2要素、つまり、3つめにリストに追加した要素が現行要素となります。当然、範囲外の要素を現行にしようとした場合には、エラーになります。


関連項目:






最終更新:2018年12月23日 16:19