ObjectScript の変数と範囲
変数は、値が格納される場所の名前です。多くのコンピュータ言語とは異なり、ObjectScript では変数を宣言する必要はありません。変数は、値が割り当てられたときに作成されます。
変数の種類
ObjectScript には、数種類の変数があります。
-
ローカル変数。データをメモリに保持します。
ローカル変数の範囲は、パブリックまたはプライベートです。
-
グローバル変数 (またはグローバル)。データをデータベースに保持します。グローバルとのやり取りはすべて、データベースに直接作用します。例えば、グローバルの値を設定した場合、その変更は、格納されているデータに直ちに作用し、値を格納するために別のステップは行われません。同様に、グローバルを削除すると、そのデータはデータベースから直ちに削除されます。
-
プロセス・プライベート・グローバル変数 (PPG)
-
特殊変数 (システム変数)
このページでは主に、ローカル変数とグローバル変数について説明します。
変数名
変数の名前は、変数の種類を決定します。変数の名前は、以下のルールに従う必要があります。
-
大部分のローカル変数の場合、最初の文字は英字であり、残りの文字は英字または数字です。有効な名前には、myvar や i があります。
-
大部分のグローバル変数は、最初の文字は常にキャレット (^) です。残りの文字は、英字、数字、またはピリオドです。有効な名前には、^myvar や ^my.var があります。
-
プロセス・プライベート・グローバル変数の最初の文字はキャレットです。詳細は、"プロセス・プライベート・グローバル" を参照してください。
ローカル変数とグローバル変数に対して、InterSystems IRIS はパーセント変数と呼ばれるバリエーションをサポートしています。これらは、あまり一般的ではありません。パーセント変数の名前は、パーセント文字 (%) で始まります。パーセント変数は、常にパブリックである点と、プロセス内のすべてのコードから見える点で特別です。これは、呼び出し元スタック内のすべてのメソッドとすべてのプロシージャを含みます。
パーセント変数を定義する場合は、以下のルールに従います。
-
ローカル・パーセント変数の場合は、%Z または %z で始まる名前にします。他の名前はシステムで使用するために予約されています。
-
グローバル・パーセント変数の場合は、^%Z または ^%z で始まる名前にします。他の名前はシステムで使用するために予約されています。
名前とバリエーションの詳細は、"識別子のルールとガイドライン" のリファレンス・ページを参照してください。
変数の可用性と範囲
ObjectScript は、以下のプログラミング・フローをサポートしており、それは他のプログラミング言語でサポートされているフローと多くの面で類似しています。
-
ユーザがメソッドを呼び出します (通常はユーザ・インタフェースから)。
-
そのメソッドは、いくつかの文を実行し、2 番目のメソッドを呼び出します。
-
2 番目のメソッドは、ローカル変数 A、B、および C を定義します。
変数 A、B、および C は、このメソッド内の範囲内で使用されます。それらは、このメソッドに対してプライベートです。
-
2 番目メソッドは、グローバル変数 ^D も定義します。
-
2 番目のメソッドは終了し、制御が最初のメソッドに戻ります。
-
最初のメソッドが実行を再開します。このメソッドは、変数 A、B、および C を使用できません。それらは定義されていない状態になっています。^D は、直ちにデータベースに保存されたため、使用できます。
上記のプログラム・フローはとても一般的なものです。ただし、InterSystems IRIS では他のオプションも提供されており、それに注意する必要があります。
既定の変数の範囲
変数を定義するメソッドの外でその変数を使用できるかどうかは、いくつかの要因によって決まります。それらを説明する前に、以下の環境の詳細を確認する必要があります。
-
InterSystems IRIS インスタンスには、複数のシステム・ネームスペースと、場合によってはユーザが定義した複数のネームスペースなど、複数のネームスペースが含まれています。
-
1 つのネームスペース内で複数のプロセスを同時に実行できます。一般的なアプリケーションでは、多数のプロセスが同時に実行されています。
以下のテーブルに、変数を使用できる場所をまとめます (別のページで説明されているプロセス・プライベート・グローバル変数を除く)。
変数の可用性 (種類別) | それが定義されているコードの外 (ただし、同じプロセス内) | 同じネームスペースの他のプロセス内 | 同じ InterSystems IRIS インスタンス内の他のネームスペース |
---|---|---|---|
ローカル変数、プライベート範囲* | いいえ | いいえ | いいえ |
ローカル変数、パブリック範囲 | はい | いいえ | いいえ |
ローカル・パーセント変数 | はい | いいえ | いいえ |
グローバル変数 (パーセント以外) | はい | はい | いいえ (グローバル・マッピングで許可されていない場合)† |
グローバル・パーセント変数 | はい | はい | はい |
*既定では、プロシージャまたはメソッド内で定義された変数は、前述したとおり、そのプロシージャまたはメソッドに対してプライベートです。また、プロシージャまたはメソッドでは、変数をパブリック変数として宣言できます。ただし、この方法はお勧めできません。"PublicList" を参照してください。
†各ネームスペースには、特定の目的のための既定のデータベースがあり、追加のデータベースへのアクセスを提供するマッピングを設定できます。その結果、グローバル変数がグローバル・パーセント変数でない場合でも、それを複数のネームスペースで使用可能にすることができます。"ネームスペースとデータベース" を参照してください。
NEW コマンド
InterSystems IRIS には、変数の範囲の制御を可能にするもう 1 つのメカニズムがあります。NEW コマンドです。このコマンドの引数は、コンマで区切られた 1 つ以上の変数名のリストです。この変数は、パブリック変数である必要があり、グローバル変数にすることはできません。
このコマンドにより、変数 (既に存在していてもいなくてもかまいません) に対して新しい、制限されたコンテキストが確立されます。例えば、以下のルーチンを考えてみます。
; demonew
; routine to demo NEW
NEW var2
set var1="abc"
set var2="def"
quit
このルーチンを実行した後は、以下のターミナル・セッションの例に示すように、変数 var1 は使用可能であり、変数 var2 は使用できません。
TESTNAMESPACE>do ^demonew
TESTNAMESPACE>write var1
abc
TESTNAMESPACE>write var2
write var2
^
<UNDEFINED> *var2
NEW を使用する前に変数が存在している場合は、NEW の範囲が終了した後もその変数は存在し、それが前に持っていた値を保持します。例えば、前に定義されたルーチンを使用する、以下のターミナル・セッションを考えてみます。
TESTNAMESPACE>set var2="hello world"
TESTNAMESPACE>do ^demonew
TESTNAMESPACE>write var2
hello world
可変長
変数の値の長さは、文字列長の制限未満にする必要があります。
変数の存在と未定義の変数
変数は、通常、SET コマンドを使用して定義します。前述したように、グローバル変数を定義すると、それはデータベースに直ちに作用します。
グローバル定数は、それを削除した (KILL コマンドを使用して削除する) 場合にのみ未定義になります。これも、即座にデータベースに作用します。
ローカル変数は、以下の 3 つのいずれかの方法で未定義になります。
-
削除 (KILL) された場合。
-
それが定義されているプロセスが終了した場合。
-
そのプロセス内の範囲から抜けた場合。
変数が定義されているかどうかを判別するには、$DATA 関数を使用します。例えば、以下は、この関数を使用するターミナル・セッションを示しています。
TESTNAMESPACE>write $DATA(x)
0
TESTNAMESPACE>set x=5
TESTNAMESPACE>write $DATA(x)
1
最初のステップで、$DATA を使用して、変数が定義されているかどうかを調べます。0 が表示され、変数が定義されていないことを示します。次に、変数を 5 に設定し、再試行します。今度は関数が 1 を返します。
未定義の変数にアクセスしようとすると、<UNDEFINED> エラーが発生します。以下に例を示します。
TESTNAMESPACE>WRITE testvar
WRITE testvar
^
<UNDEFINED> *testvar
#dim (オプション)
ObjectScript では、変数を宣言する必要はありません。ただし、#dim プリプロセッサ指示文をコードの記述の補助として使用できます。この指示文を使用して、IDE ではタイプ・ヒントを提供できます。
#dim の構文形式は、以下のとおりです。
#dim VariableName As DataTypeName
#dim VariableName As List Of DataTypeName
#dim VariableName As Array Of DataTypeName
ここで、VariableName は、データ型を指定する変数で、DataTypeName は、そのデータ型を指定します。
グローバル変数とジャーナリング
InterSystems IRIS では、グローバルの SET と KILL は、ジャーナル化されたトランザクション・イベントとして扱われます。このようなイベントでは、トランザクションをロールバックすると、これらの処理が取り消されて元の状態に戻ります。他のプロセスからアクセスできないように、変更したトランザクションがコミットされるまでロックを使用できます。詳細は、"トランザクション処理" を参照してください。
対照的に、ローカル変数またはプロセス・プライベート・グローバル変数の SET または KILL は、ジャーナル化されたトランザクション・イベントとして扱われません。このようなイベントでは、トランザクションをロールバックしても、これらの処理には何の影響もありません。