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)を使って定義されたすべてのパラメータは、参照値「&」を必要とします。