Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

変数

変数は、値が格納される場所の名前です。ObjectScript では、変数にデータ型がなく、宣言の必要はありません。

一般的には、SET コマンドを使用して、変数に値を代入することによって変数を定義します。null 文字列 ("") の値も変数に割り当てられます。コマンドおよび関数の多くは、変数を定義してから、その変数を使用する必要があります。変数が未定義である場合、既定においては、変数を参照すると <UNDEFINED> エラーが生成されます。%SYSTEM.Process.Undefined()Opens in a new tab メソッドの設定により、未定義変数の参照時に <UNDEFINED> エラー生成がなくなるよう、Caché 動作を変更することができます。

READ コマンド、$INCREMENT 関数、$BIT 関数、引数を 2 つ使用した形式の $GET 関数など、演算によっては、未定義の変数を使用できます。これらの関数は値を変数に代入します。$DATA 関数の場合、未定義または定義済みの変数を使用して、その状態を返します。

変数のカテゴリ

ObjectScript には、いくつかの変数の種類があります。

それぞれのカテゴリは目的別に使用されます。また、有効範囲の規則が異なる場合もあります。プログラム内は、(値の割り当てや関数の引数としての受け渡しなど) 同じ方法であらゆる変数のカテゴリを使用できます。

ローカル変数

ローカル変数は、現在の Caché プロセスに格納される変数です。作成したプロセスだけにアクセス可能となります。マッピングによりすべてのネームスペースからアクセスできます。プロセスの終了時、そのプロセスのローカル変数はすべて削除されます。

Caché では、ローカル変数の SETKILL は、ジャーナル化されたトランザクション・イベントとして扱われません。このようなイベントでは、トランザクションをロールバックしても、これらの処理には何の影響もありません。

名前付け規約

次の名前付け規約を使って、ローカル変数を定義します。

  • ローカル変数名は、有効な識別子である必要があります。最初の文字は必ず、文字、もしくはパーセント記号 (%) のいずれかです。“%” 記号で始まる変数名は、“パーセント変数” と呼ばれ、その有効範囲は異なります。“%Z” または “%z” で始まる変数のみがアプリケーション・コードで使用できます。その他すべてのパーセント変数は、規則に従ってシステムで使用するために予約されています。この規則の詳細は、"Caché プログラミング入門ガイド" の “識別子のルールとガイドライン” を参照してください。パーセント記号 (%) は、ローカル変数名の最初の文字以外には使用できません。ローカル変数名のその他の文字は、文字または数字になります。

  • 変数名には、あらゆる単語を使用できます。ただし、変数名には ObjectScript コマンドや SQL の予約語を使用しないことを強くお勧めします。

  • ローカル変数名は、大文字と小文字を区別します。例えば、MYVAR、MyVar および myvar は、3 つの異なるローカル変数となります。

  • Unicode システムでは、ASCII 255 よりもコード値が大きい文字 (Unicode 文字) をローカル変数名に使用できます。

  • ローカル変数名は、現在のプロセスに一意であることが必要です。その他のプロセスは、同じ名前のローカル変数を持つことができます。プロセス・プライベート・グローバルまたはグローバルは、ローカル変数と同じ名前を持つことができます。例えば、myvar、^||myvar および ^myvar は、3 つの異なる変数となります。

  • ローカル変数名の長さは、最大 31 文字です。31 文字より長い名前を指定することもできますが、最初の 31 文字のみが使用されます。このため、ローカル変数名は最初の 31 文字内で一意である必要があります。

  • ローカル変数には、添え字を使用できます。添え字を使用することで、ローカル変数を値の配列として、ローカル変数を定義できます。添え字は数字または文字列とすることができ、Unicode 文字も使用できます。

Note:

%IS ユーティリティは、いくつかのローカル変数をすべて大文字の名前で設定します。%IS が呼び出される状況では、これらの変数名の使用を回避する必要があります。詳細は、"Caché 入出力デバイス・ガイド" の "入出力デバイスとコマンド" を参照してください。

無効な名前

上記の名前付け規約に準拠しないローカル変数名の場合、<SYNTAX> エラーが生成されます。ただし例外が 1 つあり、無効な変数名の先頭がアンダースコア文字でその後に文字が続く場合は、<_CALLBACK SYNTAX> エラーが生成されます。(エラー名にアンダースコア文字が含まれる点に注意してください)。SET _abc = 123SET x = _abc などがその例です。これは、Caché では、これらの名前がローカル変数名ではなく VISM コントロール名と認識されるためです。

種類、使用、および有効範囲

3 種類のローカル変数があります。

  • プライベート変数プロシージャ・ブロックで使用される変数はすべて、自動的にプライベート変数となり、そのプロシージャ・ブロック内でのみ参照できます。既定では、スタジオで生成されるすべてのオブジェクト・メソッドがプロシージャ・ブロックを使用するため (プロシージャ・ブロック・クラス・キーワードは、クラス定義内で設定されます)、メソッドで生成されるすべての変数がプライベート変数です。プライベート変数に NEW コマンドを使用できません。

  • パブリック変数NEW コマンドを使用して変数が再定義されている場合、またはプログラムがプロシージャ・ブロックに入った場合を除き、パブリック変数は一度定義すると、現在のプロセス内にあるすべてのコードから参照できます。

  • % 変数。名前が “%” で始まる変数は、常にパブリック変数として処理されます。これにより、プロセスのすべてのコードで使用できる特殊変数を定義することができます。“%Z” または “%z” で始まる変数のみがアプリケーション・コードで使用できます。その他すべてのパーセント変数は、規則に従ってシステムで使用するために予約されています。この規則の詳細は、"Caché プログラミング入門ガイド" の “識別子のルールとガイドライン” を参照してください。

XECUTE コマンドでは、使用する変数をプライベートまたはパブリックのいずれかで指定できます。パブリックおよびプライベート変数の詳細は、"変数の宣言と範囲" のセクションを参照してください。

引数の指定なしで WRITE または ZWRITE コマンドを使用すると、現在定義されているローカル変数をすべてリストできます。$QSUBSCRIPT 関数を使って、指定したローカル変数のコンポーネント (名前と添え字) を返したり、$QLENGTH 関数を使って、添え字の層の数を返すことができます。また、KILL コマンドを使用して、ローカル変数を削除できます。

プロセス・プライベート・グローバル

プロセス・プライベート・グローバルは、これを作成したプロセスによってのみアクセス可能な変数です。マッピングによりすべてのネームスペースからアクセスできます。プロセスの終了時、プロセス・プライベート・グローバルはすべて削除されます。

プロセス・プライベート・グローバルは、サイズの大きなデータ値に使用することができます。多くの場合、Mgr/Temp ディレクトリで使用するための置換値の役割を果たし、プロセスの終了時に自動クリーンアップを行います。

Caché では、プロセスのプライベート・グローバルの SETKILL は、ジャーナル化されたトランザクション・イベントとして扱われません。このようなイベントでは、トランザクションをロールバックしても、これらの処理には何の影響もありません。

名前付け規約

プロセス・プライベート・グローバル名は、次のいずれかの形式となります。

^||name 
^|"^"|name 
^["^"]name 
^["^",""]name

これらの 4 つの接頭語は同等で、4 つはいずれも同じプロセス・プライベート・グローバルを参照します。最初の形式 (^||name) がもっとも一般的で、新しいコードに推奨されるものです。2 番目 ~ 4 番目の形式は、グローバルを定義する既存のコードとの互換性のために提供されています。これにより、name をプロセス・プライベート・グローバルまたは標準グローバルとして、定義するかどうかを決定する変数を指定できます。詳細は、以下の例を参照してください。

  SET x=1       // toggle storage type
  IF x=1 {
    SET a="^"   // for a process-private global
  }
  ELSE {
    SET a=""    // for a standard global
  }
  SET ^|a|name="a value"

プロセス・プライベート・グローバルは、次の名前付け規約を使用します。

  • プロセス・プライベート・グローバル名は、有効な識別子である必要があります。最初の文字 (2 番目の垂直バーの後) は必ず、文字、もしくはパーセント記号 (%) のいずれかにする必要があります。パーセント記号 (%) は、プロセス・プライベート・グローバル名の最初の文字以外には使用できません。“%Z” または “%z” で始まるパーセント変数のみがアプリケーション・コードで使用できます (^||%zmyppg^||%Z123 など)。その他すべてのパーセント変数は、規則に従ってシステムで使用するために予約されています。この規則の詳細は、"Caché プログラミング入門ガイド" の “識別子のルールとガイドライン” を参照してください。

    プロセス・プライベート・グローバル名の 2 番目およびその後に続く文字は、文字、数字、ピリオド記号 (.) になります。ピリオドを、名前の最初または最後の文字にすることはできません。

  • プロセス・プライベート・グローバル名には、Unicode 文字 (ASCII 255 よりもコード値が大きい文字) を使用できません。プロセス・プライベート・グローバル名に Unicode 文字を使用すると <WIDE CHAR> エラーが発生します。

  • プロセス・プライベート・グローバル名は、大文字と小文字を区別します。

  • プロセス・プライベート・グローバル名は、プロセス内で一意である必要があります。

  • プロセス・プライベート・グローバル名は、接頭語を除き最大 31 文字です。31 文字より長い名前を指定することもできますが、最初の 31 文字のみが使用されます。このため、プロセス・プライベート・グローバル名は最初の 31 文字内で一意である必要があります。

  • プロセス・プライベート・グローバルには、添え字を使用できます。添え字を使用することで、プロセス・プライベート・グローバルを値の配列として定義できます。添え字は数字または文字列とすることができ、Unicode 文字も使用できます。添え字の規約や添え字レベルの数に対する制約など、添え字の使用に関する情報については、"Caché グローバルの使用法" の "グローバル構造" を参照してください。

プロセス・プライベート・グローバルのリスト

^GETPPGINFO ユーティリティを使用して、現在のプロセス・プライベート・グローバルの名前およびそれらのスペース割り当てをブロック単位で表示できます。^GETPPGINFO はプロセス・プライベート・グローバルの添え字または値をリストしません。プロセス ID (pid) 指定により特定プロセスの、またはワイルドカード文字列 (*) 指定によりすべてのプロセスのプロセス・プライベート・グローバルが表示できます。^GETPPGINFO を呼び出すには %SYS ネームスペースにいる必要があります。

以下の例では、^GETPPGINFO を使用して、すべての現在プロセスのプロセス・プライベート・グローバルをリストします。

  SET ^||flintstones(1)="Fred"
  SET ^||flintstones(2)="Wilma"
  ZNSPACE "%SYS"
  DO ^GETPPGINFO("*")

^GETPPGINFO の構文は以下のとおりです。

^GETPPGINFO("pdf","options","outfile")

pdf 引数はプロセス IDまたは * ワイルドカードにすることができます。options 引数は次のあらゆる組み合わせを含んだ文字列にすることができます。b (バイト値を返す)、Mnn (nn 以上のブロックを使用するプロセス・プライベート変数のみを返す)、S (画面表示を抑制し、outfile を伴い使用)、T (プロセス合計のみを表示)。outfile 引数は、^GETPPGINFO 出力を受け取るために使用する CSV (comma-separated values) 形式ファイルのファイル・パスです。

次の例では、プロセス・プライベート変数を ppgout という名前の出力ファイルに書き込みます。S オプションにより画面表示が抑制され、M500 オプションにより出力を 500 ブロック以上使用するプロセス・プライベート変数のみに限定します。

  ZNSPACE "%SYS"
  DO ^GETPPGINFO("*","SM500","/home/myspace/ppgout") 

グローバル

グローバルは、Caché データベースに自動的に格納される特殊な変数です。これは固有のネームスペースにマッピングされるので、拡張参照を使用しない限り、そのネームスペース内でのみアクセスできます。グローバルは任意のプロセスからアクセスできます。グローバルは、そのグローバルを作成したプロセスの終了後も存続します。グローバルは、明示的に削除されるまで存続します。

Caché では、グローバルの SETKILL は、ジャーナル化されたトランザクション・イベントとして扱われます。このようなイベントでは、トランザクションをロールバックすると、これらの処理が取り消されて元の状態に戻ります。グローバルに対する変更に他のプロセスからアクセスできないように、変更したトランザクションがコミットされるまでロックを使用できます。詳細は、“トランザクション処理” の章を参照してください。

ObjectScript プログラムでは、他の変数と同様にグローバルを使用できます。グローバル名は、構文的に “^” 文字を文字またはパーセント “%” 記号の前に置いて区別します。

 SET mylocal = "This is a local variable"
 SET ^myglobal = "This is a global stored in the current namespace"

グローバルの命名規約は、以下のとおりです。

  • グローバルは、グローバル接頭語とグローバル名で構成されています。グローバル接頭語は、通常、キャレット (^) 文字で、現在のネームスペースでのグローバルであることを指定します。グローバル接頭語は、^|"samples"| などの拡張参照とすることもでき、この場合は別のネームスペースでのグローバルであることを指定します。

  • グローバル名は、有効な識別子である必要があります。(接頭語の文字の後の) 最初の文字は必ず、文字、もしくはパーセント記号 (%) のいずれかです。アプリケーションのコードで使用できるのは、先頭の文字を “%Z” または “%z” としたパーセント変数のみです (^%zmyglobal^%Z123 など)。これらの ^%Z グローバルと ^%z グローバルは CACHESYS データベースに書き込まれるので、Caché のアップグレードを経ても保持されます。上記以外のすべてのパーセント変数は、"Caché プログラミング入門ガイド" の “識別子のルールとガイドライン” の説明にあるルールに従って、システム用途で保持されます。

    グローバル名の 2 番目およびその後に続く文字は、文字、数字、ピリオド記号 (.) になります。ピリオドを、名前の最初または最後の文字にすることはできません。

  • グローバル名には、Unicode 文字 (ASCII 255 よりもコード値が大きい文字) を使用できません。グローバル名に Unicode 文字を使用すると <WIDE CHAR> エラーが発生します。

  • グローバル名は、大文字と小文字を区別します。

  • グローバル名は、そのネームスペース内で重複しないようにします。

  • グローバル名は、接頭語を除き最大 31 文字です。31 文字より長い名前を指定することもできますが、最初の 31 文字のみが使用されます。このため、グローバル名は最初の 31 文字内で一意である必要があります。

  • グローバルに添え字を使用できます。添え字を使用することで、グローバルを値の配列として定義できます。 添え字は数字または文字列とすることができ、Unicode 文字も使用できます。添え字の規約や添え字レベルの数に対する制約など、添え字の使用に関する情報については、"Caché グローバルの使用法" の "グローバル構造" を参照してください。

  • インターシステムズで使用する目的で保持されているグローバル名もあります。詳細は、"Caché プログラミング入門ガイド" の “回避する必要があるグローバル変数名” を参照してください。

または、グローバルは、カレット文字のすぐ後に垂直バーまたは角括弧のペアを使用して、ネームスペースやディレクトリを定義する拡張参照を指定できます (^|"samples"|myglobal または ^|""|myglobal など)。これらの拡張グローバル参照をプロセス・プライベート・グローバルと混同しないでください。

$ZREFERENCE 特殊変数を使用して、最後に使用されたグローバルの名前を特定できます。$QSUBSCRIPT 関数を使って、指定したグローバルのコンポーネントを返したり、$QLENGTH 関数を使って、添え字の層の数を返すことができます。

グローバルの詳細は、"Caché グローバルの使用法" を参照してください。

添え字付き変数

ローカル変数、プロセス・プライベート変数、およびグローバル変数はすべて、添え字を使用できます。以下のように、すべてのタイプの変数について、添え字の規約は類似したものとなります。

  • 添え字は数値または文字列にすることができます。添え字には Unicode 文字をはじめ、あらゆる文字を含めることができます。有効な数値の添え字は、正と負の数、ゼロ、および小数を含みます。空の文字列 ("") は有効な添え字ではありません。

  • 添え字の値は、大文字と小文字で区別されます。

  • 数値の添え字はキャノニック形式に変換されます。したがって、^a(7)、^a(007)、^a(7.000)、および ^a(7.) はすべて同じ添え字となります。文字列の添え字はキャノニック形式に変換されません。したがって、^a(“7”)、^a(“007”)、^a(“7.000”)、および ^a(“7.”) は異なる添え字となります。文字列の添え字 ^a(“7”) は数値の添え字 ^a(7) と同じです。

  • 添え字名の最大長は、エンコードされた 511 バイトです (対応する文字数は、添え字および現在のロケールに応じて異なります)。添え字の最大長を超えると <SUBSCRIPT> エラーになります。ただし、最長許容整数は 309 桁であり、この制限を超えると、<MAXNUMBER> エラーになります。したがって、309 文字よりも長い数値の添え字は、文字列として指定する必要があります。

  • ローカル変数の添え字レベルの最大数は 255 です。グローバルまたはプロセス・プライベート・グローバルの添え字レベルの最大数は 253 です。添え字レベルの最大数を超えると <SUBSCRIPT> エラーになります。

実際の最大数はいくつかの要因によって変わります。グローバルの最大数に関する詳細は、"Caché グローバルの使用法" の "グローバル構造" の章を参照してください。

ロック名の添え字は変数の添え字と同一の規約に従います。

配列変数

配列変数は、1 つ以上の添え字レベルを持つ変数です。添え字は括弧で囲まれています。添え字のレベルはコンマで区切られます。どの変数も (特殊変数を除く)、次の例に示すように 配列として使用できます。

 SET a(1) = "A local variable array"
 SET a(1,1,1) = "Another local variable array"
 SET ^||a(1) = "A process-private global array"
 SET ^a(1) = "A global array"
 SET obj.a(1) = "A multidimensional array property"

ローカル変数の添え字レベルの最大数は 255 です。グローバル変数の添え字レベルの最大数は添え字名の長さに応じて異なります。添え字の規約と制限に関する詳細は、"Caché グローバルの使用法" の "グローバル構造" の章を参照してください。

特殊変数

ObjectScript には、特定のシステム情報をアプリケーションで有効にするために使用する組み込み特殊変数 (システム変数ともいいます) が多数あります。特殊変数はすべて Caché で供給される変数で、“$” 記号の接頭辞を使用した名前を使用します。ユーザがその他の特殊変数を定義することはできません。特殊変数一式をマッピングすると、すべてのネームスペースからアクセスできます。

その値は、ユーザの現在の動作環境に合わせて設定されます。特殊変数の一部は、はじめ NULL 文字列 ("") に設定されているため、特殊変数を参照しても <UNDEFINED> エラーは生成されません。特殊変数の値は現在のプロセスに固有のもので、別のプロセスからアクセスできません。

ユーザは、SET コマンドを使用して一部の特殊変数を設定できますが、それ以外の特殊変数をユーザが変更することはできません。詳細は、個々の特殊変数を参照してください。

次の例では、特殊変数 $HOROLOG を使用します。

 SET starttime = $HOROLOG
 HANG 5
 WRITE !,$ZDATETIME(starttime)
 WRITE !,$ZDATETIME($HOROLOG)

特殊変数 $HOROLOG は、現在のシステムの日付と日時を格納します。SET コマンドはこの特殊変数を使用して、ユーザ定義のローカル変数 starttime にこの値を設定します。HANG コマンドは、プログラムを 5 秒間停止します。最後に、2 つの $ZDATETIME 関数は、starttime と現在のシステムの日付と時間をユーザが読み取れる形式で返します。

以下はその他の特殊変数の例です。

 WRITE !,"$JOB = ",$JOB   // Current process ID
 WRITE !,"$ZVERSION = ",$ZVERSION   // Version info

多くの特殊変数は読み取り専用で、SET コマンドを使用して設定することができません。$DEVICE などのその他の特殊変数は、読み取り/書き込み可能で、SET コマンドで設定できます。

特殊変数には、添え字を使用できません。特殊変数は、$INCREMENT 関数を使用してインクリメントすることや KILL コマンドを使用して削除することができません。特殊変数は、"Caché ObjectScript の使用法" の “コマンド” の章の "表示 (書き込み) コマンド" で説明するように、WRITEZWRITEZZWRITE、または ZZDUMP コマンドを使用して表示できます。

特殊変数のリストと詳細説明は、"Caché ObjectScript リファレンス" を参照してください。

オブジェクト・プロパティ

オブジェクト・プロパティは、オブジェクトの特定のインスタンスに対応し、格納される値です。厳密に言うと、オブジェクト・プロパティは変数ではありませんが、構文的には他のローカル変数と同様にオブジェクト・プロパティを使用できます。

プロパティ参照には複数のタイプがあります (oref.property..property、および i%property)。オブジェクト参照 (oref) は式ではなく、ローカル変数とする必要があります。property 参照は、単一値プロパティまたは添え字付き多次元プロパティを参照できます。oref.prop1.prop2 のように、チェーン形式のプロパティ参照もできます。

以下の例は、変数として使用されるプロパティ参照を示しています。

  // Create an Address object
  SET address = ##class(Sample.Address).%New()
  // Use the properties of the object
  SET address.City = "Boston"
  WRITE "City: ",address.City,!

変数としてのプロパティ参照の使用には一定の制限があります。いずれのタイプのプロパティも、SET $BIT()SET $LISTBUILD() を使用して変更することはできません。非多次元プロパティを、SET $EXTRACT()SET $LIST()SET $PIECE() を使用して変更することはできません。$DATA()$GET()、および $INCREMENT() は、プロパティが多次元である場合にのみ、プロパティを取得できます。プロパティを MERGE コマンドで使用することはできません。これらの処理は、特殊インスタンス変数構文 i%PropertyName を使用してオブジェクト・メソッド内で実行できます。

変数のタイプと変換

ObjectScript の変数には決まった形式はありません。つまり、特定のデータ型はありません (JavaScript、VBScript、および Caché Basic も同様です)。したがって、文字列値を変数に割り当て、その後同じ変数に数値を割り当てることができます。最適化として、Caché は文字列、整数、数字、オブジェクトに異なる内部表現を使用しますが、アプリケーション・プログラマからは見えません。Caché は、使用されるコンテキストを基にして、変数の値を自動的に変換 (または解釈) します。

以下はその例です。

 // set some variables
 SET a = "This is a string"
 SET b = "3 little pigs"
 SET int = 22
 SET num = 2.2
 SET obj = ##class(Sample.Person).%New()

 // Display them
 WRITE "Here are the variables themselves: ",!
 WRITE "a: ",a,!
 WRITE "b: ",b,!
 WRITE "int: ",int,!
 WRITE "num: ",num,!
 WRITE "obj: ",obj,!,!

 // Now use them as other "types"
 WRITE "Here are the numeric interpretation of",!
 WRITE "a, b, and obj: ",!
 WRITE "+a: ",+a,!
 WRITE "+b: ",+b,!
 WRITE "+obj: ",+obj,!,!
 
 WRITE "Here are concatenations of int and num:",!
 WRITE "Concatenating int: ","I found " _ int _ " apples.",!
 WRITE "Concatenating num: ","There are " _ num _ " pounds per kilogram.",!

Caché は以下のように値を変換します。

ObjectScript の型の変換規則
変換元 変換先 規則
番号 文字列 数値を表す文字列が使用され、前の例では変数 num2.2 のようになります。
文字列 数値 文字列の先頭文字は数値リテラルとして解釈されます。これについては、“演算子と式” の章の “文字列から数値への変換” のセクションで説明しています。例えば、“–1.20abc” は -1.2 と解釈され、“abc123” は 0 と解釈されます。
オブジェクト 数値 指定されたオブジェクト参照の内部オブジェクト・インスタンス番号が使用されます。その値は整数です。
オブジェクト 文字列 n@cls 形式の文字列が使用されます。n は内部オブジェクトのインスタンス番号で、cls は指定されたオブジェクトのクラス名です。
数値 オブジェクト 許可されていません。
文字列 オブジェクト 許可されていません。

オブジェクト値

オブジェクト値は、メモリ内のオブジェクトのインスタンスを参照します。オブジェクト値をローカル変数に割り当てることができます。

 SET person = ##class(Sample.Person).%New()
 WRITE person,!
Note:

person の値は、文字列に変換されたオブジェクト参照 (OREF) の値です。文字列あるいはその値は、データベースからオブジェクトにロードするためには使用できません。

ドット構文を使用して、メソッドとオブジェクトのプロパティを参照できます。

 SET person.Name = "El Vez"

$ISOBJECT 関数を使用して、変数がオブジェクトを含むかどうかを判断します。

 SET str = "A string"
 SET person = ##class(Sample.Person).%New()

 WRITE "Is string an object? ", $IsObject(str),!
 WRITE "Is person an object? ", $IsObject(person),!

グローバルにはオブジェクト値を代入できません。割り当てると、実行時エラーが発生します。

オブジェクト値を変数 (あるいはオブジェクト・プロパティ) に割り当てると、オブジェクトの内部参照カウントがインクリメントされるという悪影響があります。オブジェクトの参照番号が 0 に到達した場合、Caché は自動的にそのオブジェクトを破壊します (%OnClose メソッドを呼び出し、そのオブジェクトをメモリから削除します)。例えば以下のようになります。

 SET person = ##class(Sample.Person).%New() // one reference to Person
 SET alias = person // two references

 SET person = "" // 1 reference 
 
 SET alias = "" // no references left, object destroyed

変数の宣言と範囲

他の言語と異なり、ObjectScript で変数を宣言する必要はありません。

変数の範囲は、変数がプログラムで “使用可能” になったときに決まります。ObjectScript では、変数の範囲に対する 2 種類の規則があります。

  • プロシージャ・ブロックを元にした標準 (新規) 範囲設定メカニズム:これは、新規アプリケーションに適したメカニズムで、スタジオで既定として使用されています。プロシージャ・ブロック内で、% 変数以外はすべてプライベート変数です。

  • 従来の範囲設定メカニズム:この値は、従来のバージョンとの互換性を保つためのものです。プロシージャ・ブロックの範囲外で、すべての変数はパブリック変数です。

これらのメカニズムの詳細は、"ユーザ定義コード" の章に説明されています。

#Dim の使用法

スタジオでコードを記述する場合は、#Dim プリプロセッサ指示文を使用できます。#Dim は、対象変数タイプについての情報を提供します。スタジオは、スタジオ・アシスト機能と共にこの情報を使用してコードを処理します。この情報は、ドキュメントに使用することも、コードを参照する可能性のある他のユーザに提供することもできます (スタジオ・アシストに関する詳細は、"スタジオの使用法" の “スタジオ・オプションの設定” の章の “エディタ・オプション” のセクションを参照してください)。

#Dim の構文形式は、以下のとおりです。

#Dim VariableName As DataTypeName
#Dim VariableName As List Of DataTypeName
#Dim VariableName As Array Of DataTypeName

ここで、VariableName は、データ型を指定する変数で、DataTypeName は、そのデータ型を指定します。スタジオには、DataTypeName の値を選択できるメニューが用意されています。

#Dim では、以下のように変数の初期値を指定することもできます。

#Dim President As %String = "Obama"
FeedbackOpens in a new tab