プログラム言語において、型は、変数がどの程度の記憶領域を使用するかということに関係します。 たとえば、短整数を格納する上で必要な記憶領域は、長整数を格納する場合と比べて小さくなります。プログラム言語では、ユーザが宣言した変数のタイプに応じて特定の領域を割り当てるのです。 使用できる型の例を以下に挙げます。
Integer(整数) : 小数点を持たない数値。 格納時のメモリの消費量が少なく、配列の指数を表す場合に多用されます。 一部の言語では、Short(通常は単に integer と呼ばれる)と値の範囲が広い Long 整数(通常は単に long と呼ばれる)が区別されます。
Floating point(浮動小数): 小数点を持つ数値。 一般的に Float と呼ばれる単精度の 32 ビット形式と Double と呼ばれる倍精度の 64 ビット形式という 2 つの精度があります。
String(文字列) : 1文字または 1 文字の集合。 文字列の長さは可変です。 文字列に保存される文字数によってメモリの使用量が決まります。
Boolean(ブール) : 真偽を示す数値。通常 1 ビットで表されます(1=yes、0=no)。 これらは、関数の成否を示す戻り値としてしばしば使用されます。
Variant(バリアント) : 不特定のデータ型で、特にオブジェクト、数値、または文字列のいずれかを保持する可能性のあるパラメータに便利です。 この型は、主に ActiveX をベースにした Windows Scripting Host 言語(VBScript や JScript など)で使用されます (C# の型 System.Object は、Variant 型にマッピングします)。
Object(オブジェクト): オブジェクトへのリファレンス。 実際に格納されるのは、メモリにおけるアドレスへのリファレンスです。
Empty/Undefined/Null(空白/未定義/ヌル): 言語により異なります。 意図的に無指定にした場合、型を識別する言語もあれば、定義を必要とする言語もあります。また、言語によっては 0 バイト文字("")として識別されます。
User-defined(ユーザ定義): カスタマイズされたデータ型。 プログラマまたはユーザがプログラムの一部としてデータ型を定義します。
Array(配列) : 他のデータ値のリスト。 一部の言語では、配列を独立したデータ型として扱いませんが、配列はデータ型と密接に関連しています。 詳細については、「Softimage での配列(および他のコレクション)の操作」を参照してください。
このリストには、指定可能なタイプの一般的な概要のみが記載されています。 詳細な情報については、「言語間でのデータ タイプを比較する 」またはマニュアルで、選択したスクリプトまたはプログラミング言語の説明を参照してください。
VBScript には型が 1 つしかありません。このタイプは、Variant 型と呼ばれ、上の一覧中のタイプの大半に対応した種類の異なるいくつかのサブタイプから構成されます。 たとえば VBScript でサポートされているサブタイプとしては、integer および long の両方のほか、object、boolean、および string があります。
VBScript では、自動的に型の強制変換(キャスティング)が実行されます。さらに、特殊な事前定義済みの関数(CStr、Clng、CDbl など)を使用した、データ型間の明示的な変換も可能です。
VBScript で(Dimension キーワードを使用して)変数を作成すると、その変数は常に Variant 型になります。
' First you declare the variable (always variant) dim myIndex dim myNumber, myLetter ' When you assign a value, VBScript decides what ' subtype it is based on the value myIndex = 0 myNumber = 365.77351 myLetter = "A"
VBScript では、入力として変数を取り、そのサブタイプを戻す TypeName()関数を使用できます。
myIndex = 0 myNumber = 365.77351 myLetter = "A" ' NB: You have to use the set keyword for objects set my3DObject = ActiveSceneRoot Application.LogMessage TypeName(myIndex) Application.LogMessage TypeName(myNumber) Application.LogMessage TypeName(myLetter) Application.LogMessage TypeName(my3DObject) 'INFO : Integer 'INFO : Double 'INFO : String ' TypeName can also figure out the class name ' of object variables 'INFO : Model
JScript では、すべての変数が汎用のデータ型で宣言されます。この点で、JScript と VBScript のタイプは類似しています。ただし、(variable キーワードを使用して)変数に値を代入すると、その variant 型は自動的にいくつかあるデータ型(String、Number、Boolean、Object、Array、Null、および Undefined)のいずれか 1 つに強制変換されます。
// You can declare and assign separately var myIndex; myIndex = 0; // You can declare and assign at the same time var myNumber = 365.77351; var myLetter = "A";
JScript では、VBScript の TypeName()関数のように、入力として変数を取り、その型を戻す typeof()オペレータを使用できます。 ただし、TypeName とは異なり、クラス名ではなく、基本データ型だけを戻します。 Softimage や他のアプリケーションで使用される ActiveX オブジェクトでこのオペレータを使用すると、「object」が戻されます。 このため、ネイティブの Softimage オブジェクトを扱っている場合は、ClassName (Application)メソッドを使用したほうがはるかに効率的です。
// You can declare and assign separately var myIndex = 0; var myNumber = 365.77351; var myLetter = "A"; var my3DObject = ActiveSceneRoot; Application.LogMessage( typeof(myIndex) ); Application.LogMessage( typeof(myNumber) ); Application.LogMessage( typeof(myLetter) ); Application.LogMessage( typeof(my3DObject) ); // Once we know we are dealing with an 'object' // we can test it with Application.ClassName if ( typeof(my3DObject) == "object" ) { Application.LogMessage( ClassName(my3DObject) ); } else { Application.LogMessage( typeof(my3DObject) ); } //INFO : number //INFO : number //INFO : string //INFO : object //INFO : Model
Python は、データ型を非常に重視しますが、VBScript や JScript のように自動強制型変換は実行しません。 しかし、変数の宣言に特別なキーワードは使用しません。割り当てステートメントで指定する必要があるのは新しい変数の名前だけです。これで、その変数が初期化された(最初に値が割り当てられた)際に、Python は型の種類を判別します
# You can assign a single value to a variable myIndex = 0 # You can also assign multiple values at once myNumber, myLetter = 365.77351, "A"
変数が初期化されると、明示的な型変換オペレータを使用しなくても、その変数に異なる型の値を割り当てることができます。 しかし、さまざまな型を使用して変数を操作する場合は、型変換関数(int()、str()、および float())のいずれかを使用する必要があります。
val = 123 stmt = "sally has " # msg = stmt + val + " marbles" # Note: the above commented statement will generate # the following error message #ERROR : Traceback (most recent call last): # File "<Script Block >", line 3, in ? # msg = stmt + val + " marbles" #TypeError: cannot concatenate 'str' and 'int' #objects - [line 3] msg = stmt + str(val) + " marbles" # The above statement converts the numeric value # into a string to avoid a mismatch while # concatenating: Application.LogMessage( msg ) #INFO : sally has 123 marbles
Python では、VBScript の TypeName()関数のように、入力として変数を取り、その型を戻す type()関数を使用できます。 ただし、TypeName とは異なり、クラス名ではなく、基本データ型だけを戻します。 Softimage や他のアプリケーションで使用される ActiveX オブジェクトでこの関数を使用すると、「<type 'instance'>」が戻されます。このため、ネイティブの Softimage オブジェクトを扱っている場合は、ClassName (Application)メソッドを使用したほうがはるかに効率的です。
myIndex, myNumber, myLetter = 0, 365.77351, "A" my3DObject = Application.ActiveSceneRoot Application.LogMessage( str(type(myIndex)) ) Application.LogMessage( str(type(myNumber)) ) Application.LogMessage( str(type(myLetter)) ) Application.LogMessage( str(type(my3DObject)) ) # Once we know we are dealing with an 'instance' # we can test it with Application.ClassName if str(type(my3DObject)) == "<type 'instance'>": Application.LogMessage( \ Application.ClassName(my3DObject) ) else: Application.LogMessage( str(type(my3DObject)) ) #INFO : <type 'int'> #INFO : <type 'float'> #INFO : <type 'str'> #INFO : <type 'instance'> #INFO : Model
C++ には、整数型から浮動小数タイプまで、独自のデータ型がさまざまに存在します。 また、ユーザ定義のデータ型もサポートしています。 C++ では、型に対して何らかの強制変換(キャスト)が暗黙的に実行されます。
この強要変換に対して厳しい規制も課されます。 その処理を C++ に依存するよりも、明示的にデータ型間の変換を実行するほうがはるかに望ましいと言えます。
C++ で変数を作成するときは、以下のように式の一部として型を含めてください。
// You can declare and assign separately int myIndex; myIndex = 0; // You can declare and assign at the same time double myNumber = 365.77351; char myLetter = "A"; // You must explicitly declare the class of each // Softimage object instance you create Application app; app.LogMessage( L"Hello, World!" ); // The scene root is an instance of the Model class Model root = app.GetActiveSceneRoot();
C# では型は特別なもので、整数や浮動小数点数など、複数の種類があります。 C# では、ユーザ定義の型もサポートしています。
C# は、一部の型キャスト(データ型間での変換)について大変厳密です。 さらに、C# 配列には異なる型のメンバを含めることができません。