参照パラメータの引き渡し

MAXScript は参照パラメータの引き渡しをサポートしています。これにより、参照を呼び出し元のコンテキスト内の変数、プロパティ、または配列要素に、関数のパラメータとして渡すことができます。また、呼び出される関数のパラメータに対する割り当ては、すべて呼び出し元の変数、プロパティ、または配列要素に直接割り当てられます。このしくみは、関数の複数の結果を渡すためにしばしば利用されます。

関数の参照パラメータを定義するには、先頭に文字「&」を付けます。

システム例外の注意:

次の例はエラーとなります。

エラーの例:

fn test1 &p3 = return &p3.x
p=[1,2,3]
r=test1 p
*r

結果: アクセス違反です。

コール スタックから渡されたローカルへの参照を戻すことはエラーになりますが、これを効率的に検出することは非常に困難です。システム例外を引き起こすことがあるので、ローカル変数への &refs を戻さないように 注意してください。

function foo x y &z =
(
-- ...
z = x * y
-- ...
return true
)
-- test function
z = 12
foo 5 6 &z

3 つのパラメータ x、y、z を取る関数を宣言します。パラメータ リストの &z は、z パラメータの参照渡しが行われることを示します。この関数を呼び出す場合、新しい「&」参照演算子を使用して z パラメータの参照値を指定します。

local var1, var2
...
var1 = foo 2 3 &var2

上記の例では、引数 2、3 および &var2 を使って foo 関数を呼び出しています。 &var2 は、var2 ローカル変数への参照です。関数の呼び出し時に、本体の z パラメータは、呼び出し側の var2 ローカルへの参照になります。

z = x * y

また foo 本体において、x * y が呼び出し側の var2 ローカルに割り当てられます。下記を実行すると、

var1 = foo 2 3 &var2

var1 には true が格納され、 var2 には x * y または 6 が格納されます。

参照パラメータは任意の数を使用できます。また、必要に応じてキーワード パラメータとして使用することも可能です。

fn foo x y &z: = ...

次のようにして呼び出します。

var1 = foo 2 3 z:&var2 

参照の引き渡しに使用される「 & 」参照演算子は、MAXScript の任意の <accessor> 構文に適用できます。これら 2 つのオペレータは次のとおりです。

variables (locals, globals, rollout locals, plug-in locals, etc.)
property access
array index
parameter (of a scripted plug-in)

p = [1, 2, 3]
foo 2 3 &p.x

これにより、上記のポイントの x 座標が参照で渡されます。呼び出し後に p の値は次のようになります。

[6, 2, 3]

a = #(1, 2, 3, 4, 5)
foo 2 3 &a[3]

これにより、配列の 3 番目の要素が参照で渡されます。呼び出し後に a の値は #(1, 2, 6, 4, 5) になります。

注:

この機能は、BY-REF インタフェース メソッド パラメータおよびその結果をサポートするために、MAXScript の関数公開インタフェースで使用されます。公開されたインタフェースで、by-ref (またはタイプ コード suffix _BR)を使って定義されたすべてのパラメータは、参照値「&」を必要とします。

関連事項