[前へ] [目次へ] [次へ]

変数


FGESの変数は「参照」と「実体」に分けられます。
ソースコード上で扱う変数は本質的には「型付きの参照型」であり、
実体となるオブジェクトは別に割り当てる必要があります。

その一方で実体の割り当ては頻繁に行う操作であることやC++との互換性の観点から、
変数定義時に同時に実体を割り当てる「実体定義」と参照のみを定義する「参照定義」があります。

グローバル変数、インスタンス変数、ローカル変数を定義する場合、 var で始めます。
クラス共有変数を定義する場合、 classvar で始めます。
ローカル変数を定義する場合で、属性を明示するかグローバル名前空間に定義された型名を使用する場合、最初の var は省略できます。

●実体定義

   実体定義を行うと、記述位置に対応した寿命の実体(オブジェクト)が作成されます。
   実体を作成できない不完全型、抽象クラス、インターフェイス、実体化不可型を
   変数の型として使用することはできません。
   
   作成された実体の寿命は以下の通りです。
記述位置寿命
グローバル定義空間プロセスの終了まで
クラス定義空間(クラス共有)所属するクラスオブジェクトと同じ
クラス定義空間(インスタンス)所属するオブジェクトと同じ
メソッド定義空間定義したローカルスコープの終了まで

   また、属性として readonly または const を記述することで、参照は読み取り専用となります。
   読み取り専用の参照からはメンバ参照時に全てのメンバが読み取り専用になり、
   const 属性を持たないクラスメンバメソッドが呼び出せなくなります。
   ( const 表記はC/C++との記述互換性のために認められており、同一に解釈されます)

   さらに、ローカル変数を定義する場合、属性に depend を記述することで参照の属性を this と同じにすることができます。
   属性に上記の属性のいずれも記述しない場合は参照は編集可能属性となります。
   
   加えて、ローカル変数を定義する場合、
   属性として static を記述することでそのオブジェクトの寿命を記述したメソッドの寿命と同じにすることができます。
   この時初期化式または一斉初期化式(後述)が付いている場合、初めて実行する時にのみ評価されます。
   なお複数の属性を同時に指定する場合、 static 属性は最初に記述する必要があります。

   構文1:(変数型は 型名 解釈です)
   var 属性 変数型 変数名 ;
   classvar 属性 変数型 変数名 ;


   例1: Integer 型の変数 n を定義する
   var Integer n;
   classvar Integer n;


   同じ属性、変数型を持つ変数を複数一斉に定義できます。
   構文2:(変数型は 型名 解釈です)
   var 属性 変数型 変数名1 , 変数名2 , 変数名3 ;
   classvar 属性 変数型 変数名1 , 変数名2 , 変数名3 ;


   例2: Integer 型の変数 n1,n2,n3 を定義する
   var Integer n1,n2,n3;
   classvar Integer n1,n2,n3;


   グローバル変数、クラス共有変数、ローカル変数の
   定義時に初期化式を付けることができます。
   
   初期化式はグローバル変数、クラス共有変数は定義時に即座に実行されます。
   この時、初期化式はグローバルメソッドと同じ扱いになります。
   ローカル変数は該当位置を通過する時に実行されます。
   この時、初期化式はメソッド内のローカル名前空間で評価されます。
   
   初期化式の結果は作成した実体オブジェクトの #operator= を使用して代入されます。
   初期化式を使用する場合は変数型が #operator= を定義している必要があります。
   構文3:(変数型は 型名 解釈です)
   var 属性 変数型 変数名 = 初期化式 ;
   classvar 属性 変数型 変数名 = 初期化式 ;
   var 属性 変数型 変数名1 = 初期化式1 , 変数名2 = 初期化式2 , 変数名3 ;
   classvar 属性 変数型 変数名1 = 初期化式1 , 変数名2 = 初期化式2 , 変数名3 ;


   例3:
   var Integer n=5;
   classvar Integer n=5;
   var Integer n1=5,n2=10,n3;
   classvar Integer n1=5,n2=10,n3;


   グローバル変数、クラス共有変数、ローカル変数の
   定義時に一斉初期化式を付けることができます。
   
   一斉初期化式はグローバル変数、クラス共有変数は定義時に即座に実行されます。
   この時、各初期化式はグローバルメソッドと同じ扱いになります。
   ローカル変数は該当位置を通過する時に実行されます。
   この時、各初期化式はメソッド内のローカル名前空間で評価されます。
   
   一斉初期化式は作成した実体オブジェクトの #operator=[] または #operator={} の
   呼び出しにコンパイルされます。
   (変数名=[ 式 ] の形式は #operator=[] 、
   変数名={ 式 } の形式は #operator={} の呼び出しになります)
   一斉初期化式を使用する場合は変数型が対応する演算子を定義している必要があります。
   構文4:(変数型は 型名 解釈です)
   var 属性 変数型 変数名 =[ 初期化式1 , 初期化式2 ];
   var 属性 変数型 変数名 ={ 初期化式1 , 初期化式2 };
   classvar 属性 変数型 変数名 =[ 初期化式1 , 初期化式2 ];
   classvar 属性 変数型 変数名 ={ 初期化式1 , 初期化式2 };


   例4:
   var Integer[] n=[5,10,15];
   var Integer{} n={"a",5,"b",10};
   classvar Integer[] n=[5,10,15];
   classvar Integer{} n={"a",5,"b",10};



●参照定義

   参照定義を行うと、空参照(からさんしょう)が作成されます。
   空参照は実体のない参照で、C/C++におけるNULLポインタとほぼ同等です。
   空参照に対してオブジェクトを対象とする操作を行うと例外が発生します。
   #IsNULL や #== といった参照自体を対象とする演算子は使用できます。
   また、空参照をメソッドの引数として使うこともできます。
   
   また、属性として readonly または const を記述することで、参照は読み取り専用となります。
   読み取り専用の参照からはメンバ参照時に全てのメンバが読み取り専用になり、
   const 属性を持たないクラスメンバメソッドが呼び出せなくなります。
   ( const 表記はC/C++との記述互換性のために認められており、同一に解釈されます)

   さらに、ローカル変数を定義する場合、属性に depend を記述することで参照の属性を this と同じにすることができます。
   属性に何も記述しない場合は参照は編集可能属性となります。
   
   構文1:(変数型は 型名 解釈です)
   var 属性 変数型 @ 変数名 ;
   classvar 属性 変数型 @ 変数名 ;


   例1: Integer 型の参照 n を定義する
   var Integer@ n;
   classvar Integer@ n;


   同じ属性、変数型を持つ参照を複数一斉に定義できます。
   構文2:(変数型は 型名 解釈です)
   var 属性 変数型 @ 変数名1 , 変数名2 , 変数名3 ;
   classvar 属性 変数型 @ 変数名1 , 変数名2 , 変数名3 ;


   例2: Integer 型の参照 n1,n2,n3 を定義する
   var Integer@ n1,n2,n3;
   classvar Integer@ n1,n2,n3;


   グローバル変数、クラス共有変数、ローカル変数の
   定義時に初期化式を付けることができます。
   この場合の評価はC++の参照変数の定義によく似ています。
   
   初期化式の結果オブジェクトは定義した参照に結び付けられます。
   グローバル変数、クラス共有変数の定義では、初期化式の結果オブジェクトが一時オブジェクトである場合、
   定義した参照を実体定義した時 と同じ寿命に一時オブジェクトの寿命を変更します。
   ローカル変数の定義時にはこの動作はありません。
   ローカル変数の初期化式の結果オブジェクトが一時オブジェクトである場合、参照は即座に無効参照となります。
   
   初期化式はグローバル変数、クラス共有変数は定義時に即座に実行されます。
   この時、初期化式はグローバルメソッドと同じ扱いになります。
   ローカル変数は該当位置を通過する時に実行されます。
   この時、初期化式はメソッド内のローカル名前空間で評価されます。
   
   初期化式の結果オブジェクトは変数型に暗黙に変換できる型
   (同じ型、派生型、変数型のインターフェイスをサポートしている型)でなければいけません。
   グローバル変数、クラス共有変数の場合は定義時に型チェックが行われ、
   ローカル変数はコンパイル時と実行時両方で型チェックが行われます。
   ただし、変数型か初期化式の結果オブジェクトの型が Any であるか、
   = の直後に DynamicCast を記述している場合、コンパイル時の型チェックが抑止され、
   実行時のみ型チェックが行われるようになります。
   
   構文3:(変数型は 型名 解釈です)
   var 属性 変数型 @ 変数名 = 初期化式 ;
   classvar 属性 変数型 @ 変数名 = 初期化式 ;
   var 属性 変数型 @ 変数名1 = 初期化式1 , 変数名2 = 初期化式2 , 変数名3 ;
   classvar 属性 変数型 @ 変数名1 = 初期化式1 , 変数名2 = 初期化式2 , 変数名3 ;
   var 属性 変数型 @ 変数名 =DynamicCast 初期化式 ;


   例3:
   var IInteger@ n=5;
   classvar IInteger@ n=5;
   var IInteger@ n1=5,n2=10,n3;
   classvar IInteger@ n1=5,n2=10,n3;
   var IInteger@ n=DynamicCast etc_obj;



[前へ] [目次へ] [次へ]

最終更新 2020/10/22