$NAMESPACE
Synopsis
$NAMESPACE SET $NAMESPACE=namespace NEW $NAMESPACE
説明
$NAMESPACE は、現在のスタック・レベルの現在のネームスペース名を含みます。$NAMESPACE を使用すると、以下を実行できます。
-
現在のネームスペースの名前を返します。
-
SET で現在のネームスペースを変更します。
-
NEW および SET で新しい一時ネームスペース・コンテキストを確立します。
現在のネームスペース名を返す
$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 $NAMESPACE=namespace で、namespace を文字列リテラル、または引用符付きの文字列に評価される変数や式として指定します。namespace では大文字と小文字が区別されません。ただし、Caché は常に、明示的なネームスペース名をすべて大文字、暗黙のネームスペース名をすべて小文字で表示します。ネームスペース名には Unicode 文字を含めることができます。Caché は、アクセント記号付きの小文字を対応するアクセント記号付きの大文字に変換します。
namespace 名は、明示的なネームスペース名 ("USER") でも、暗黙的なネームスペース ("^^c:\InterSystems\Cache\mgr\user\") でもかまいません。暗黙的なネームスペースの詳細は、ZNSPACE コマンドを参照してください。
指定した namespace が存在しない場合、SET $NAMESPACE は <NAMESPACE> エラーを生成します。ネームスペースへのアクセス特権を持っていない場合、システムは <PROTECT> エラーを生成した後に、データベース・パスを表示します。例えば、%Developer ロールには %SYS ネームスペースへのアクセス特権がありません。このロールを持っていて、このネームスペースにアクセスしようとすると、Caché は <PROTECT> *c:\intersystems\cache\mgr\ というエラーを返します (Windows システムの場合)。
現在のネームスペースを一時的に変更する場合、処理を実行してから前のネームスペースに戻し、SET $ZNSPACE コマンドや ZNSPACE コマンドではなく SET $NAMESPACE を使用します。これは、$NAMESPACE が NEW $NAMESPACE を許可しているためです。
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"),! }
}
ルーチンを終了するか、またはエラー・トラップに分岐すると、このスタックされたネームスペースに戻ります。変更後のネームスペース内でオブジェクト・インスタンスを作成する場合、Caché は、そのネームスペース内でそのオブジェクトを閉じてから、スタックされたネームスペースに戻します。これについては、次のターミナルの例で示しています。
USER>NEW $NAMESPACE
USER 1S1>NEW myoref
USER 2N1>SET $NAMESPACE="SAMPLES"
SAMPLES 2N1>SET myoref=##class(%SQL.Statement).%New()
SAMPLES 2N1>QUIT
/* Cache closes myoref in the SAMPLES namespace
Then 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
エラーを処理して古いネームスペースに戻す必要はありません。Caché は、ユーザが現在のスタック・レベルから離れると、古いネームスペースをリストアします。
次の例は、NEW $NAMESPACE が省略されている点が前の例と異なります。QUIT の際には、ネームスペースが元に戻らないことに注意してください。
WRITE "before: ",$NAMESPACE,!
DO Test
WRITE "after: ",$NAMESPACE,!
QUIT
Test
NEW
SET $NAMESPACE="USER"
WRITE "testing: ",$NAMESPACE,!
; routine code
QUIT
プログラミングにおいて、現在のネームスペースを一時的に変更しているときには別のルーチンを呼び出すことをお勧めします。別のルーチンを呼び出すことが実用的でない場合は、従来の DO コマンドのドット構文を使用できます。以下の例では、この DO コマンド構文を使用してスタック・フレームを作成することにより、大きいサブルーチン内のネームスペースを一時的に変更します。
WRITE "before: ",$NAMESPACE,!
DO
. NEW $NAMESPACE
. SET $NAMESPACE="USER"
. WRITE "testing: ",$NAMESPACE,!
. ; routine code
WRITE "after: ",$NAMESPACE,!
関連項目
-
NEW コマンド
-
SET コマンド
-
ZNSPACE コマンド
-
$ZNSPACE 特殊変数
-
"Caché システム管理ガイド" の "ネームスペースの構成"