構造体定義

構造体定義を使用して MAXScript 内に独自の合成値を作成できます。

構造体定義により、値の新しいクラスのレイアウトを定義し、コード内でそれを作成して使用できます。

構造体定義の構文は次のとおりです。

struct <struct_name> ( <member> { , <member> } )

<member> には、次のいずれかを指定できます。

<name> [ = <expr> ] --name and optional initial value
<function_def>

   struct person (name, height, age, sex)

上記の例では、新しい「person」クラスを定義します。このクラスの値は、次のように「person」コンストラクタで作成してください。

   bill = person name: "Bill" height:72 age:34 sex:#male

person クラスのインスタンスを作成し、そのインスタンスを変数 bill に格納します。name は文字列値「Bill」に、height は整数値 72 に、age は整数値 34 に、sex は名前値 #male にそれぞれ初期化されます。

   joe = person name: "Joseph" sex:#male

person クラスのインスタンスを作成し、そのインスタンスを変数 joe に格納します。name は文字列値「Joseph」に、sex は名前値 #male にそれぞれ初期化されます。height および age メンバには値が割り当てられておらず、構造体定義にオプションの初期値が設定されていないため、既定値 undefined になります。

次のように MAXScript の標準プロパティ アクセス構文を使って、構造体の値にアクセスします。

   bill.age  --returns 34
   joe.age  --returns undefined
   joe.age = bill.age-4 --assigns Bill's age less 4 to Joe's age.

コンポーネントの数が一定(通常、少数の独立コンポーネント)で、コンポーネントを処理するコードがインデックス番号よりプロパティ名で参照した方がわかりやすい場合、構造体定義を配列の代わりに使用すると便利です。

関数定義と同様に、構造体定義は定義を表す値を実際に作成し、その値をコンストラクタと同じ名前の変数に格納します。したがって、構造体定義を別の合成オブジェクトに格納したり、関数の引数として渡すことができます。classOf() 関数では、これらの値が適用されるときにこの構造体定義値を返すため、返された値を使って構造体インスタンスの定義をランタイムでテストできます。

   classOf bill --returns person

struct 値のコンストラクタは、関数呼び出しと同様に、キーワード初期化子とポジショナル引数初期化子をとります。新しい struct の要素は、任意のポジショナル引数から順に入力されるか、キーワード引数から名前で順に入力されます。

例:

struct を次のように定義します。

   struct foo (name, age, height, hair="brown")

次の方法でインスタンスを作成できます。

   f1 = foo "bill" 23 72 --fills in name, age, height in order
   f2 = foo age:45 name: "sam" --random named initializers
   f3 = foo "mary" hair: "red" --first name, then keywords

struct 値に関連するメソッドが複数あります。

getProperty <struct> <propname>

構造体のプロパティへのアクセスを可能にします。

getPropNames <struct>

構造体のプロパティを配列として返します。

copy <struct>

構造体のコピーを作成します。作成されたコピーは、「シャロー コピー」と呼ばれます。上位レベルの値そのもののコピーのみが、struct 値が作成されます。コピーは構造体内に格納された合成値から作成されるのではなく、両方の struct 値に同じ合成値が格納されます。次の例のように、struct 値のコピーにある合成値のコンポーネント値を変更すると、オリジナルの struct 値も変更します。

スクリプト:

   Struct test (pos1, pos2) --define a structure
   testval = test [1,2,3] [4,5,6] --create struct value
   testval_copy=copy testval --copy the struct value
   testval_copy.pos1.x=10 --change component value of a compound
   --value in the copy
   testval --look at original struct value

出力:

   #Struct:test( --result line 1
     pos1:<data>; Public,
     pos2:<data>; Public)
   test(pos1:[1,2,3] pos2:[4,5,6]) --result line 2
   test(pos1:[1,2,3] pos2:[4,5,6]) --result line 3
   10 --result line 4
   (test pos1:[10,2,3] pos2:[4,5,6]) --result line 6