構造体定義を使用して MAXScript 内に独自の合成値を作成できます。
構造体定義により、値の新しいクラスのレイアウトを定義し、コード内でそれを作成して使用できます。
構造体定義の構文は次のとおりです。
struct <struct_name> ( <member> { , <member> } )
各
<member>
には、次のいずれかを指定できます。
<name> [ = <expr> ] -- 名前およびオプションの初期値
<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 -- 34 を返します。
joe.age -- undefined を返します。
joe.age = bill.age-4 -- Bill の年齢から 4 を引いた年齢を Joe に割り当てます。
|
コンポーネントの数が一定(通常、少数の独立コンポーネント)で、コンポーネントを処理するコードがインデックス番号よりプロパティ名で参照した方がわかりやすい場合、構造体定義を配列の代わりに使用すると便利です。
関数定義と同様に、構造体定義は定義を表す値を実際に作成し、その値をコンストラクタと同じ名前の変数に格納します。したがって、構造体定義を別の合成オブジェクトに格納したり、関数の引数として渡すことができます。
classOf()
関数では、これらの値が適用されるときにこの構造体定義値を返すため、返された値を使って構造体インスタンスの定義をランタイムでテストできます。
例
|
classOf bill -- person を返します。
|
struct
値のコンストラクタは、関数呼び出しと同様に、キーワード初期化子とポジショナル引数初期化子をとります。新しい
struct
の要素は、任意のポジショナル引数から順に入力されるか、キーワード引数から名前で順に入力されます。
例:
|
struct
を次のように定義します。
|
struct foo (name, age, height, hair="brown")
|
次の方法でインスタンスを作成できます。
|
f1 = foo "bill" 23 72 -- 名前、年、身長の順に入力します。
f2 = foo age:45 name: "sam" -- ランダムな名前付き初期化子
f3 = foo "mary" hair: "red" -- 最初が名前で次がキーワードです。
|
struct
値に関連するメソッドが複数あります。
getProperty <struct> <propname>
構造体のプロパティへのアクセスを可能にします。
構造体のプロパティを配列として返します。
構造体のコピーを作成します。作成されたコピーは、「シャロー コピー」と呼ばれ、上位レベルの値そのもののコピーのみ(すなわち
struct
値)が作成されます。コピーは構造体内に格納された合成値から作成されるのではなく、両方の
struct
値に同じ合成値が格納されます。次の例のように、
struct
値のコピーにある合成値のコンポーネント値を変更すると、オリジナルの
struct
値も変更します。
スクリプト:
|
Struct test (pos1, pos2) -- 構造体を定義します。
testval = test [1,2,3] [4,5,6] -- 構造体値を作成します。
testval_copy=copy testval -- 構造体値をコピーします。
testval_copy.pos1.x=10 -- コピーの合成値のコンポーネント値を
-- 変更します。
testval -- オリジナルの構造体値を探します。
|
出力:
|
#Struct:test( -- 1 行目の結果です。
pos1:<data>,
pos2:<data>)
#test(pos1:[1,2,3], pos2:[4,5,6]) -- 2 行目の結果です。
#test(pos1:[1,2,3], pos2:[4,5,6]) -- 3 行目の結果です。
10 -- 4 行目の結果です。
#test(pos1:[10,2,3], pos2:[4,5,6]) -- 6 行目の結果です。
|