$GET (ObjectScript)
構文
$GET(variable,default)
$G(variable,default)
引数
引数 | 説明 |
---|---|
variable | ローカル変数、グローバル変数、またはプロセス・プライベート・グローバル変数、添え字付きまたは添え字なし。この変数は未定義でもかまいません。variable は、構文 obj.property を持つ多次元オブジェクト・プロパティとして指定できます。 |
default | オプション — 変数が未定義の場合に返される値。変数の場合、定義が必要です。 |
概要
$GET は、指定した変数のデータ値を返します。未定義の変数の処理は、default 引数を指定しているか否かによって異なります。
-
$GET(variable) は指定した変数値か、または変数が定義されていない場合は、NULL 文字列を返します。variable 引数は、添え字付き配列要素 (ローカルあるいはグローバル) を含む、任意の変数の名前です。
-
$GET(variable,default)は変数が定義されていない場合に、既定値を提供して返します。変数が定義されている場合、$GET はその値を返します。
引数
variable
データ値が返される変数。
-
variable は、ローカル変数、グローバル変数、またはプロセス・プライベート・グローバル (PPG) 変数のいずれかにすることができます。これは添え字付きでも添え字なしでもかまいません。ObjectScript 特殊変数や構造化システム変数 (SSVN) にすることはできません。
定義済みの変数である必要はありません。$GET は未定義の変数に NULL 文字列を返します。変数の定義は行いません。変数は定義してから NULL 文字列 ("") を設定できます。グローバル変数の場合は、拡張グローバル参照を含めることができます。添え字付きグローバル変数の場合は、ネイキッド・グローバル参照を使用して指定できます。未定義の添え字付きグローバル変数を参照するときでも、variable はネイキッド・インジケータをリセットするので、以下で説明されているように、今後のネイキッド・グローバル参照に影響が及びます。
-
variable は多次元オブジェクト・プロパティにすることはできますが、非多次元オブジェクト・プロパティにすることはできません。非多次元オブジェクト・プロパティで $GET を使用しようとすると、<OBJECT DISPATCH> エラーが発生します。
例えば、%SQL.StatementMetadataOpens in a new tab クラスには、多次元プロパティ columnIndex と、非多次元プロパティ columnCount があります。以下の例では、最初の $GET は値を返し、2 番目の $GET は <OBJECT DISPATCH> エラーを返します。
SET x=##class(%SQL.StatementMetadata).%New() WRITE $GET(x.columnIndex,"columnIndex property is undefined"),! WRITE $GET(x.columnCount,"columnCount property is undefined")
default
variable が未定義の場合に返されるデータ値。添え字付き、または添え字なしのローカル変数やグローバル変数を含む、任意の式です。グローバル変数の場合は、拡張グローバル参照を含めることができます。添え字付きグローバル変数の場合は、ネイキッド・グローバル参照を使用して指定できます。存在する場合、default はネイキッド・インジケータをリセットするので、以下で説明されているように、今後のネイキッド・グローバル参照に影響が及びます。
default が未定義の変数である場合、variable が定義されていても、既定で $GET は <UNDEFINED> エラーを発行します。%SYSTEM.Process.Undefined()Opens in a new tab メソッドを設定することで、未定義の変数を参照する際に <UNDEFINED> エラーを生成しないように InterSystems IRIS の動作を変更できます。Undefined() メソッドが <UNDEFINED> エラーを生成しないように設定されている場合、$GET は、default が未定義の場合に variable を返します。
ObjectScript 特殊変数を default として指定できます。ただし、$ZORDER を指定すると、variable が定義されていても、<UNDEFINED> エラーになる場合があります。
例
以下の例では、変数 test は定義済みで、変数 xtest は未定義です (ZWRITE コマンドは、明示的に NULL 文字列値を返すので使用されます)。
KILL xtest
SET test="banana"
SET tdef=$GET(test),tundef=$GET(xtest)
ZWRITE tdef ; $GET returned value of test
ZWRITE tundef ; $GET returned null string for xtest
WRITE !,$GET(xtest,"none")
; $GET returns default of "none" for undefined variable
$DATA と比較した $GET
$GET は、$DATA に未定義の変数 ($DATA = 0) とデータ ($DATA = 10) なしの下位ポインタである配列ノードの代わりを提供しています。variable が未定義であるかデータのないポインタ配列ノードのときは、$GET は未定義のエラーなしで NULL 文字列 ("") を返します。例えば、以下の行を再コード化します。
IF $DATA(^client(i))=10 {
WRITE !!,"Name: No Data"
GOTO Level1+3
}
以下のように実行します。
IF $GET(^client(i))="" {
WRITE !!,"Name: No Data"
GOTO Level1+3
}
$DATA テストは、未定義要素と下位ポインタのみの要素を識別するので、$GET テストと比べてより多くの情報を提供します。以下の行で例を示します。
IF $DATA(^client(i))=0 { QUIT }
ELSEIF $DATA(^client(i))=10 {
WRITE !!,"Name: No Data"
GOTO Level1+3
}
以下のようには再コード化されません。
IF $GET(^client(i))="" { QUIT }
ELSEIF $GET(^client(i))="" {
WRITE !!,"Name: No Data"
GOTO Level1+3
}
2 行は、配列要素が未定義あるいはデータなしの下位ポインタのどちらであるかによって異なる動作をします。$GET がここで使用されると、最初の動作 (QUIT) のみが実行されます。$DATA を最初のテストで使用し、$GET を 2 番目に使用することができますが、その逆 (最初のテストに $GET、2 番目に $DATA を使用すること) はできません。
$GET と $SELECT の既定
$GET(variable,default) は、指定された変数が未定義のときに既定値を返します。$SELECT 関数を使用することでも、同じ結果を得ることができます。
しかし $SELECT とは異なり、$GET の 2 番目の引数は常に評価されます。
variable と default が両方とも添え字付きグローバル参照を行ってネイキッド・インジケータを変更する場合、$GET が常にその引数の両方を評価するという事実が重要になります。引数は左から右の順に評価されるので、$GET が default 値を返すか否かにかかわらず、ネイキッド・インジケータは default グローバル参照に設定されます。グローバル変数とネイキッド・インジケータでの $GET の使用に関する詳細は、"多次元ストレージの使用法 (グローバル)" を参照してください。
未定義の変数の処理
$GET は、指定された 変数が未定義の場合、処理の振る舞いを定義します。指定の変数が未定義の場合、$GET の返す基本的な形式は NULL 文字列 ("") です。
$DATA は、指定された変数が定義済みかどうかテストします。変数が未定義の場合は 0 を返します。
%SYSTEM.ProcessOpens in a new tab クラスの Undefined()Opens in a new tab メソッドを使用して、すべての未定義の変数に対する処理の動作を、プロセスごとに定義できます。システム全体の既定の動作は、Config.MiscellaneousOpens in a new tab クラスの UndefinedOpens in a new tab プロパティで設定できます。Undefined の設定は、指定された変数の $GET または $DATA の処理に影響しません。