$PROPERTY (ObjectScript)
構文
$PROPERTY(instance,propertyname,index1,index2,index3... )
引数
引数 | 説明 |
---|---|
instance | オプション — オブジェクト・インスタンス参照 (OREF) に評価される式。この表現の値は、目的のクラスのメモリにあるインスタンスの値を指定する必要があります。省略した場合、現在のオブジェクトが既定で使用されます。 |
propertyname | 文字列として評価される式。この文字列の値は、instance で指定されたクラスで定義されている既存のプロパティ名と一致する必要があります。 |
index1, index2, index3, ... | オプション — propertyname が多次元値である場合、この一連の式はプロパティが表す配列へのインデックスとして扱われます (指定したプロパティが多次元でない場合、余分な引数があると実行時にエラーが発生します)。 |
説明
$PROPERTY は、指定されたクラスにあるインスタンスで、プロパティの値を取得または設定します。この関数は、ObjectScript プログラムが、あるクラスの既存のインスタンス内の任意のプロパティの値を選択することを許可します。最初の引数はクラスのインスタンスでなければならないため、実行時に算出されます。プロパティ名は、実行時に算出することもできれば、文字列リテラルとして指定しておくこともできます。文字列の内容は、クラスで宣言されたプロパティの名前と正確に一致する必要があります。プロパティ名は、大文字と小文字を区別します。
プロパティが多次元であるとして宣言されている場合は、プロパティ名の後の引数は、多次元配列へのインデックスとして扱われます。最大で 255 の引数をインデックスに使用できます。
$PROPERTY は割り当て式の左側にも記述できます。$PROPERTY が割り当て演算子の左にある場合は、値の割り当て先の場所を指定します。右側にある場合は計算で使用する値であることを示します。
instance が有効なメモリ内 OREF ではない場合、<INVALID OREF> エラーが発生します。propertyname が有効なプロパティではない場合、<PROPERTY DOES NOT EXIST> エラーが発生します。index1 を指定し、かつ propertyname が多次元でない場合、<OBJECT DISPATCH> エラーが発生します。
多次元として宣言されていないプロパティから多次元値を取得したり、多次元ではないプロパティに多次元値を設定したりしようとすると、<FUNCTION> エラーが発生します。
$PROPERTY とメソッド
$PROPERTY 関数は、渡されたプロパティの Get() メソッドまたは Set() メソッドを呼び出します。この関数は、“Instance.PropertyName” 構文と機能的には同じです。ここで、“Instance” および “PropertyName” は、この関数のシグニチャに記述する引数と同等です。このため、プロパティに Get() メソッドや Set() メソッドが存在する場合、その中では $PROPERTY を呼び出さないでください。Get() および Set() メソッドの詳細は、"プロパティ・メソッドの使用とオーバーライド" を参照してください。
メソッド内で、現在のインスタンスのプロパティを参照するために $PROPERTY を使用する場合は、instance を省略できます。ただし、普通は instance の後に続くコンマは、この場合も必要です。
例
以下の例は、現在の NLS 言語プロパティ値を返します。
USER>set nlsoref=##class(%SYS.NLS.Locale).%New()
USER>write $property(nlsoref,"Language")
English
以下は、割り当て演算子の右と左の両方で $PROPERTY を使用する例です。
USER>set TestFile = ##class(%Library.File).%New("AFile")
USER>write TestFile.Name
AFile
USER>set $property(TestFile,"Name") = $property(TestFile,"Name") _ "Renamed"
USER>write TestFile.Name
AFileRenamed
以下の例は、現在のオブジェクト (この場合は SQL シェル) からプロパティ値を返します。$PROPERTY は、最初の引数を省略して指定されています。
USER>DO $SYSTEM.SQL.Shell()
SQL Command Line Shell
----------------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter <command>, 'q' to quit, '?' for help.
[SQL]USER>>set path="a,b,c"
path="a,b,c"
[SQL]USER>>! WRITE "The schema search path is ",$PROPERTY(,"Path")
The schema search path is "a,b,c"
[SQL]USER>>
以下の例は、%Dictionary API を使用してオブジェクトのプロパティ名を取得します。
ClassMethod ShowProperties(oref As %RegisteredObject)
{
set class = oref.%ClassName(1)
set classdef=##class(%Dictionary.CompiledClass).%OpenId(class)
set proplist=classdef.Properties
for i=1:1:proplist.Count() {
set prop=proplist.GetAt(i)
write !, "Value of "_prop.Name_":"_$property(oref,prop.Name)
}
}
以下では、このメソッドが使用されています。
%SYS>set db=##Class(SYS.Database).%OpenId("C:\InterSystems\SAMPLEINSTALL\mgr\irisaudit")
%SYS>d ##class(Demo.Demo).ShowProperties(db)
Value of %%OID: 'C:\InterSystems\SAMPLEINSTALL\mgr\irisauditSYS.Database
Value of %Concurrency: 0
Value of BlockFormat: 2
Value of BlockSize: 8192
Value of Blocks: 128
Value of BlocksPerMap: 62464
Value of ClusterMountMode: 0
Value of ClusterMounted: 0
Value of CurrentMaps: 1
Value of Directory: c:\intersystems\sampleinstall\mgr\irisaudit\
Value of DirectoryBlock: 3
Value of EncryptedDB: 0
Value of EncryptionKeyID:
Value of Expanding: 0
Value of ExpansionSize: 0
Value of Full: 0
Value of GlobalJournalState: 3
Value of InActiveMirror: 0
Value of LastExpansionTime:
Value of LastVolumeDirectory: c:\intersystems\sampleinstall\mgr\irisaudit\
Value of LastVolumeSize: 1
...
関連項目
-
$CLASSMETHOD 関数
-
$CLASSNAME 関数
-
$METHOD 関数
-
$PARAMETER 関数
-
$THIS 特殊変数