「型」について

 
 
 

プログラム言語において、型は、変数がどの程度の記憶領域を使用するかということに関係します。 たとえば、短整数を格納する上で必要な記憶領域は、長整数を格納する場合と比べて小さくなります。プログラム言語では、ユーザが宣言した変数のタイプに応じて特定の領域を割り当てるのです。 使用できる型の例を以下に挙げます。

VBScript のタイプ

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 での型のテスト

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 では、すべての変数が汎用のデータ型で宣言されます。この点で、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 での型のテスト

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 の型

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"

Python での型の変換

変数が初期化されると、明示的な型変換オペレータを使用しなくても、その変数に異なる型の値を割り当てることができます。 しかし、さまざまな型を使用して変数を操作する場合は、型変換関数(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 での型のテスト

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++ に依存するよりも、明示的にデータ型間の変換を実行するほうがはるかに望ましいと言えます。

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++ では型が非常に重視されるため、変数に割り当てた項目の型を常に宣言する必要があります。したがって、ClassName や他の型テスト関数と同等の関数はありません。

ヒント:

基本型または struct によって使用されているバイト数を戻す sizeof()オペレータを使用できますが、異なるプラットフォームまたはマシン間の整合性に依存できません。

sizeof()オペレータの詳細については、msdn2.microsoft.com/en-us/library/ms860979.aspx を参照してください。

C# の型(比較用)

C# では型は特別なもので、整数や浮動小数点数など、複数の種類があります。 C# では、ユーザ定義の型もサポートしています。

C# は、一部の型キャスト(データ型間での変換)について大変厳密です。 さらに、C# 配列には異なる型のメンバを含めることができません。

重要:

bool 型は、その他の基本データ型(intcharfloat など)以外の場所で設定されます。これは、bool 型とその他の型を変換することはできないためです。 つまり、空の文字列または 0 は false と同等ではなく、同様に登録されている文字列または 0 以外の値も true と同等ではありません。

したがって、すべての条件テスト(if または while 句のコンテキストで評価されるテストなど)は、true のブール値を厳密に評価する必要があります(その他のデータ型は強要されたり、自動的に変換されたりしません)。

C# での型のテスト(比較用)

C# では型が非常に重視されるため、変数に割り当てた項目の型を常に宣言する必要があります。したがって、ClassName や他の型テスト関数と同等の関数はありません。

注:

C# 言語の詳細については、msdn2.microsoft.com/vcsharp/Aa336809 を参照してください。