引数の参照渡し
既定では、クラス・メソッドの引数は値によって渡されます。つまり、クラス・メソッドは渡された変数の値を受け取りますが、その値の変更は非公開であり、メソッド内でのみ認識可能です。メソッド外の元の変数の値は変化しません。例の最初の部分の DoubleByVal() は変数 num を使用してそれを 2 倍にしますが、クラス・メソッドの外部の num 変数の値は変化しません。
ObjectScript は引数を参照によって渡すこともできます。つまり、クラス・メソッドが変数の値を変更するときに、そのメソッド外の変数の値を変更します。この場合、両方の変数が同じメモリ位置を参照します。参照によってクラス・メソッドに引数を渡すことができるのは、引数の前にドットが付いている場合のみです。配列をメソッドに渡すには、ドットを使用して参照によって渡す必要があります。
-
DoubleByRef1() クラス・メソッドは num を 2 倍にします。これはドットが num の前に付いているためです。メソッド・シグニチャの ByRef は、単にドットを使用するよう呼び出し側に注意を促すものです。
-
DoubleByRef2() クラス・メソッドは、result を作成してその前にドットを付けて、num を 2 倍にします。メソッド・シグニチャの Output は、単にドットを使用するよう呼び出し側に注意を促すものです。
引数を渡す処理の例:
VS Code - ObjectScript
/// examples for ObjectScript Tutorial
Class ObjectScript.Examples
{
/// demo of passing arguments by value and reference
ClassMethod PassingArguments(num as %Numeric)
{
// pass by value
set dblnum = ..DoubleByVal(num)
write !, "By Value: ", num, " doubled is: ", dblnum
// num passed IN and OUT by reference
write !, "By Reference 1: ", num
do ..DoubleByRef1(.num)
write " doubled is: ", num
// num passed IN by value, result passed OUT by reference
do ..DoubleByRef2(num, .result)
write !, "By Reference 2: ", num, " doubled again is: ", result
}
ClassMethod DoubleByVal(anynumber as %Numeric) as %Numeric
{
return anynumber * 2
}
ClassMethod DoubleByRef1(ByRef anynumber as %Numeric)
{
set anynumber = anynumber * 2
}
ClassMethod DoubleByRef2(anynumber as %Numeric, Output retnumber as %Numeric)
{
set retnumber = anynumber * 2
}
}
ターミナルを使用したテスト
USER>do ##class(ObjectScript.Examples).PassingArguments(3)
By Value: 3 doubled is: 6
By Reference 1: 3 doubled is: 6
By Reference 2: 6 doubled again is: 12
USER>