Solaris 動的トレースガイド

連想配列

連想配列では、「キー」と呼ばれる名前を指定して取得できるデータ要素の集積を表現できます。D の連想配列のキーは、「」と呼ばれるスカラー式の値のリストで構成されます。配列の組は、配列の参照時に対応する配列値を取得するために呼び出される関数のパラメータリストのようなものです。D の連想配列には、それぞれ決まった型の、決まった数の組要素で構成される、固定の「キー署名」が 1 つずつ割り当てられています。D プログラムでは、配列ごとに異なるキー署名を定義できます。

連想配列は、通常の固定サイズの配列とは異なり、要素数があらかじめ制限されていません。単に整数をキーとして使用するのではなく、任意の組で要素にインデックスを付けることができます。また、要素は、事前に割り当てられた連続した記憶域に格納されるわけではありません。連想配列は、C、C++、JavaTM 言語プログラム内の、ハッシュテーブルなどの単純な辞書データ構造を使用する場合に便利です。連想配列を使用すると、D プログラム内で捕捉したイベントや状態の動的な履歴を作成し、より複雑な制御フローを実現できます。

連想配列を定義するには、次のような形式の代入式を記述します。

name [ key ] = expression ;

name は任意の有効な D 識別子、key は 1 つ以上の式をコンマで区切った形式のリストです。たとえば、以下の式は、キー署名 [ int, string ] を持つ連想配列 a を定義し、[ 123, "hello" ] という組で指定された場所に整数値 456 を格納します。

a[123, "hello"] = 456;

配列内の各オブジェクトの型は、その配列内のすべての要素に共通の型で、固定されています。たとえば、a には最初に整数 456 が割り当てられているので、その後この配列に格納される値はすべて int 型になります。連想配列の要素を変更するときは、第 2 章で定義した代入演算子を、それぞれに定義されたオペランド規則に従って使用します。非互換な割り当てがあると、D コンパイラからエラーメッセージが返されます。連想配列のキーや値には、スカラー変数で使用できる任意の型を使用できます。連想配列をキーまたは値として、ほかの連想配列内に入れ子にすることはできません。

連想配列は、配列キー署名と互換性のある任意の組を使って参照できます。組の互換性の規則は、関数呼び出しと変数割り当ての互換性の規則に似ています。 同じ長さの組を使用する必要があります。また、実パラメータリスト内の型と、正規のキー署名内の対応する型との間には、互換性がなければなりません。たとえば、連想配列 x を次のように定義したとします。

x[123ull] = 0;

この場合、キー署名は unsigned long long 型、値は int 型になります。この配列は、式 x['a'] を使って参照することもできます。これは、「型変換」で説明した算術変換規則により、長さが 1 の int 型の文字定数 'a' で構成された組と、unsigned long long 型のキー署名に互換性があるからです。

D の連想配列を明示的に宣言してから使用する必要がある場合は、プログラムソースコードのプローブ節の外側に、配列名とキー署名の宣言を記述します。

int x[unsigned long long, char];

BEGIN
{
	x[123ull, 'a'] = 456;
}

連想配列の定義後は、互換性のあるキー署名を持つ組がすべて参照可能になります。まだ割り当てられていない組も参照できます。まだ割り当てられていない連想配列要素にアクセスすると、定義により、ゼロが格納されたオブジェクトが返されます。この定義によると、連想配列要素に配下の記憶域を割り当てるためには、この要素にゼロ以外の値を割り当てる必要があります。反対に、連想配列要素にゼロを割り当てると、DTrace により、配下の記憶域の割り当てが解除されます。この動作は重要な意味を持っています。なぜなら、連想配列要素に割り当てられる動的な変数空間には限りがあるからです。割り当てる空間が足りないと、割り当てに失敗し、動的な変数の中断を示すエラーメッセージが表示されます。使用していない連想配列要素には、常にゼロを割り当ててください。動的な変数の中断を予防するその他のテクニックについては、第 16 章オプションとチューニング可能パラメータを参照してください。