構造体定義を使用して 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