辞書

辞書パーツ は、常時使用可能なパーツであり、定義を必要としません。 辞書パーツに基づいた変数には一連のキーとそれらに関連した値を組み込むことができ、実行時に「キーおよび値」エントリーを追加したり除去したりできます。 それらのエントリーは、レコード内のフィールドのように扱われます。

辞書宣言の例を次に示します。
  row Dictionary
    {
      ID        = 5,
      lastName  = "Twain",
      firstName = "Mark",
    };

宣言の中にエントリーを組み込むとき、各キー名は EGL 識別子であり、EGL の命名規則に従っている必要があります。 実行時にエントリーを追加するときは、さらに柔軟性が増し、文字列リテラル、定数、または変数を指定できます。また、その場合、内容は EGL の予約語でもよく、識別子の中では無効となる文字を含めることもできます。 詳細については、『動的アクセス用の大括弧構文 (Bracket syntax for dynamic access)』を参照してください。

代入の例を以下に示します。
  row.age = 30;
  row["Credit"] = 700;
  row["Initial rating"] = 500
既に存在するキーを代入しようとすると、既存の「キーおよび値」エントリーがオーバーライドされます。 次の代入は有効であり、「Twain」が「Clemens」に置き換えられます。
  row.lastname = "Clemens";
代入をデータの取り出しに使用することもできます。
  lastname String
  age, credit, firstCredit int;

  lastname = row.lastname;
  age = row.age;
  credit = row.credit;
  credit = row["Credit"];
  firstCredit = row["Initial rating"];
「キーおよび値」エントリーの値は、ANY 型です。したがって、さまざまな種類の情報を単一の辞書に入れることができます。 それぞれの値は、以下のいずれかにすることができます。
変数を辞書に入れると、その変数のコピーが代入されます。次のレコード・パーツを考えてみます。
  Record ExampleRecordPart
	   x int;
	 end

次のコードは、ExampleRecordPart 型の変数を辞書に入れ、その後、元の 変数内の値を変更します。

  testValue int;

  myRecord ExampleRecordPart;

  // 変数の値を設定し、
  // その変数のコピーを辞書に入れる。
  myRecord.x = 4;
  row Dictionary
  {
    theRecord myRecord;
  } 
	
  // 元のレコードに新規の値を入れる。
  myRecord.x = 700;

  // 辞書のレコードのコピーにアクセスし、
  // testValue に 4 を代入する。
  testValue = row.theRecord.x;
1 つの辞書を別の辞書に代入すると、代入先の内容が代入元の内容で置き換えられ、代入先辞書のプロパティー値がオーバーライドされます。これについては、後で説明します。 例えば、次のコード内の条件文は、真です。
  row Dictionary { age = 30 };

  newRow Dictionary { };
  newRow = row

  // 結果は真
  if (newRow.age == 30)
    ;
  end

宣言の中のプロパティー・セットは、その辞書が処理される方法に影響を及ぼします。 辞書固有の一連の関数は、コードにデータとサービスを提供します。

辞書のプロパティー

次の例に示すように、それぞれの「プロパティーおよび値」エントリーは、構文上、1 つの「キーおよび値」エントリーと等価であり、これらのエントリーは任意の順序で配置できます。
  row Dictionary
    { 
      // プロパティー
      caseSensitive = no,
      ordering = none,
     
      // フィールド
      ID        = 5,
      lastName  = "Twain",
      firstName = "Mark"
      age = 30;
    };
コードでプロパティーやその値を追加したり、取り出したりすることはできません。 ありそうにないことですが、プロパティー名をキーとして使用したいという場合は、キーを指定するか参照するときに、次の例のように変数名を修飾子として使用します。
  row Dictionary
    { 
      // プロパティー
      caseSensitive = no,
      ordering = none,
     
      // フィールド
      row.caseSensitive = "yes"
      row.ordering = 50,
      age = 30
    };
プロパティーは、以下のとおりです。
caseSensitive
値の格納に使用された大/小文字が、キーまたは関連する値の取り出しに影響を及ぼすかどうかを示します。以下のオプションがあります。
No (デフォルト)
キー・アクセスは、キーの大/小文字に影響を受けず、以下の文は同じ意味になります。
  age = row.age;
  age = row.AGE;
  age = row["aGe"];
Yes
EGL は本質的に大/小文字を区別しない言語ですが、以下の文は異なる結果になる可能性があります。
  age = row.age;
  age = row.AGE;
  age = row["aGe"];

プロパティー caseSensitive の値は、この後のセクションで説明するいくつかの関数の振る舞いに影響を及ぼします。

ordering
「キーおよび値」エントリーが、取り出しの目的でどのように順序付けられるかを示します。 このプロパティーの値は、この後のセクションで述べるように、関数 getKeysgetValues の振る舞いに影響を及ぼします。

以下のオプションがあります。

None (デフォルト)
コードで、「キーおよび値」エントリーの順序を当てにすることはできません。

プロパティー ordering の値が None の場合、(関数 getKeys が呼び出されたときの) キーの順序は、(関数 getValues が呼び出されたときの) 値の順序と異なる場合があります。

ByInsertion
「キーおよび値」ペアを、それらが挿入された順序で入手できます。 宣言内のエントリーは、左から右への順序で挿入されるものと見なされます。
ByKey
「キーおよび値」ペアを、キーの順序で入手できます。

辞書関数

以下の関数を呼び出すには、必ず、次の例のように関数名を辞書名で修飾してください。この例では、辞書名は row です。
  if (row.containsKey(age))
    ; 
  end

containsKey()

  dictionaryName.containsKey(key String in) returns (Boolean)

この関数は、入力ストリング (key) が辞書内のキーであるかどうかに応じて、真または偽へと解決されます。辞書プロパティー caseSensitive が no に設定されている場合、大/小文字の区別は考慮されません。それ以外の場合、関数は大/小文字の一致も含め、完全に一致するものを探します。

containsKey は、論理式でのみ使用されます。

getKeys()

  dictionaryName.getKeys ( ) returns (String[ ])

この関数は、各ストリングが辞書内のキーである、ストリングの配列を戻します。

辞書プロパティー caseSensitive が no に設定されている場合、戻される各キーは小文字になります。それ以外の場合、戻される各キーは、そのキーが格納されたときと同じ大/小文字になります。

辞書プロパティー ordering が no に設定されている場合、戻されるキーの順序を当てにすることはできません。それ以外の場合、順序は、このプロパティーの説明の中で指定されたとおりになります。

getValues()

  dictionaryName.getValues ( ) returns (ANY[ ])

この関数は、あらゆる型の値の配列を戻します。各値は、辞書内のキーに関連付けされます。

insertAll()

  dictionaryName.insertAll(sourceDictionary Dictionary in)

この関数は、一連の assignment 文が、ソース辞書 (sourceDictionary) 内の「キーおよび値」エントリーを target (これは関数名を修飾している名前を持つ辞書です) にコピーするかのように動作します。

キーがソース内に存在してターゲット内に存在しない場合、その「キーおよび値」エントリーは、ターゲットへコピーされます。 キーがソースとターゲットの両方に存在する場合、ソース・エントリーの値がターゲット内のエントリーをオーバーライドします。 ターゲット内のキーがソース内のキーに一致するかどうかの判別は、各辞書の caseSensitive プロパティーの値によって影響を受けます。

この関数は、1 つの辞書を別の辞書へ代入するわけではありません。なぜなら、関数 insertAll では、以下のエントリーが保存されるからです。
  • ターゲット内の「プロパティーおよび値」エントリー、および
  • ターゲット内に存在し、ソース内に存在しない「キーおよび値」エントリー

removeElement()

  dictionaryName.removeElement(key String in)

この関数は、入力ストリング (key) が辞書内のキーであるエントリーを除去します。 辞書プロパティー caseSensitive が no に設定されている場合、大/小文字の区別は考慮されません。それ以外の場合、関数は大/小文字の一致も含め、完全に一致するものを探します。

removeAll()

  dictionaryName.removeAll( )

この関数は、辞書内のすべての「キーおよび値」エントリーを除去しますが、辞書のプロパティーには影響を及ぼしません。

size()

  dictionaryName.size( ) returns (INT)

辞書内の「キーおよび値」エントリーの数を示す整数を戻します。

関連リファレンス
論理式

フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.