$NAMESPACE (ObjectScript)
構文
$NAMESPACE
SET $NAMESPACE=namespace
NEW $NAMESPACE
引数
引数 | 説明 |
---|---|
namespace | 既存のネームスペースの名前。引用符付きのリテラル文字列、または引用符付きの文字列に解決される式として指定します。ネームスペース名は、大文字と小文字を区別しません。 |
説明
$NAMESPACE は、現在のスタック・レベルの現在のネームスペース名を含みます。$NAMESPACE を使用すると、以下を実行できます。
-
現在のネームスペースの名前を返します。
-
SET で現在のネームスペースを変更します。
-
NEW および SET で新しい一時ネームスペース・コンテキストを確立します。
コード・モジュール内で、現在のネームスペースを変更するお勧めの方法は、NEW $NAMESPACE に続けて SET $NAMESPACE=namespace を使用することです。
現在のネームスペース名を返す
$NAMESPACE 特殊変数は、現在のネームスペース名を含みます。
また、以下のように %SYSTEM.SYSOpens in a new tab クラスの NameSpace()Opens in a new tab メソッドを呼び出すことで、現在のネームスペース名を取得することもできます。
WRITE $SYSTEM.SYS.NameSpace()
以下のように %Library.FileOpens in a new tab クラスの NormalizeDirectory()Opens in a new tab メソッドを使用して、現在のネームスペースのフル・パス名を取得できます。
WRITE $NAMESPACE,!
WRITE ##class(%Library.File).NormalizeDirectory("")
以下のように、%SYS.NamespaceOpens in a new tab クラスの Exists()Opens in a new tab メソッドを使用して、ネームスペースが定義されているかどうかをテストすることができます。
WRITE ##class(%SYS.Namespace).Exists("USER"),! ; an existing namespace
WRITE ##class(%SYS.Namespace).Exists("LOSER") ; a non-existent namespace
これらのメソッドは、"インターシステムズ・クラス・リファレンス" を参照してください。
SET $NAMESPACE
SET コマンドを使用して、$NAMESPACE を既存ネームスペースに設定できます。
コード・モジュール内で、ネームスペースを変更するお勧めの方法は、SET $ZNSPACE または ZNSPACE コマンドを使用することではなく、NEW $NAMESPACE に続けて SET $NAMESPACE=namespace を使用することです。
SET $NAMESPACE=namespace で、namespace を引用符付きの文字列リテラル、または引用符付きの文字列に評価される変数や式として指定します。namespace では大文字と小文字が区別されません。ただし、InterSystems IRIS は常に、明示的なネームスペース名をすべて大文字、暗黙のネームスペース名をすべて小文字で表示します。ネームスペース名には Unicode 文字を含めることができます。InterSystems IRIS は、アクセント記号付き小文字を対応アクセント記号付き大文字に変換します。
namespace 名は、明示的なネームスペース名 ("USER") でも、暗黙的なネームスペース ("^^c:\InterSystems\IRIS\mgr\user\") でもかまいません。暗黙的なネームスペースの詳細は、ZNSPACE コマンドを参照してください。
指定した namespace が存在しない場合、SET $NAMESPACE は <NAMESPACE> エラーを生成します。ネームスペースへのアクセス特権を持っていない場合、システムは <PROTECT> エラーを生成した後に、データベース・パスを表示します。例えば、%Developer ロールには %SYS ネームスペースへのアクセス特権がありません。このロールを持っていて、このネームスペースにアクセスしようとすると、InterSystems IRIS は <PROTECT> *c:\intersystems\iris\mgr\ というエラーを返します (Windows システムの場合)。
NEW $NAMESPACE
$NAMESPACE の設定で、現在のネームスペースを変更できます。これは、メソッドやその他のルーチンでネームスペースを変更するお勧めの方法です。NEW $NAMESPACE および SET $NAMESPACE を使用することによって、メソッドが終わったときまたは予期しないエラーが発生したときに前のネームスペースに自動的に戻すネームスペース・コンテキストを確立します。
TRY {
WRITE "before the method: ",$NAMESPACE,!
DO MyNSMethod("DocBook")
WRITE "after the method: ",$NAMESPACE
RETURN
MyNSMethod(ns)
NEW $NAMESPACE
IF ##class(%SYS.Namespace).Exists(ns) {
SET $NAMESPACE=ns }
ELSE {SET $NAMESPACE="User" }
WRITE "namespace changed in method: ",$NAMESPACE,!
SET num=5/$RANDOM(2)
QUIT
NextMethod()
WRITE "This should not write",!
}
CATCH exp {
WRITE "namespace after error in method: ",$NAMESPACE,!
IF 1=exp.%IsA("%Exception.SystemException") {
WRITE "System exception: ",$ZCVT(exp.Name,"O","HTML"),! }
}
ルーチンを終了するか、またはエラー・トラップに分岐すると、このスタックされたネームスペースに戻ります。これについては、次のターミナルの例で示しています。
USER>NEW $NAMESPACE
USER 1S1>SET $NAMESPACE="SAMPLES"
SAMPLES 1S1>SET myoref=##class(%SQL.Statement).%New()
SAMPLES 1S1>QUIT
/* The QUIT reverts to the USER namespace */
USER>
例
以下の例は、呼び出し元プログラムと異なるネームスペースで実行されるルーチンを呼び出します。これは、NEW $NAMESPACE を使用して、現在のネームスペースをスタックします。次に SET $NAMESPACE を使用して、テストが継続している間はネームスペースを変更します。QUIT で、スタックされているネームスペースに戻ります。
WRITE "before: ",$NAMESPACE,!
DO Test
WRITE "after: ",$NAMESPACE,!
QUIT
Test
NEW $NAMESPACE
SET $NAMESPACE="USER"
WRITE "testing: ",$NAMESPACE,!
; routine code
QUIT
エラーを処理して古いネームスペースに戻す必要はありません。InterSystems IRIS は、ユーザが現在のスタック・レベルから離れると、古いネームスペースをリストアします。
次の例は、NEW $NAMESPACE が省略されている点が前の例と異なります。QUIT の際には、ネームスペースが元に戻らないことに注意してください。
WRITE "before: ",$NAMESPACE,!
DO Test
WRITE "after: ",$NAMESPACE,!
QUIT
Test
NEW
SET $NAMESPACE="USER"
WRITE "testing: ",$NAMESPACE,!
; routine code
QUIT
プログラミングにおいて、現在のネームスペースを一時的に変更しているときには別のルーチンを呼び出すことをお勧めします。