2012年3月1日木曜日

Dartにおける型とモード

このエントリーをはてなブックマークに追加
Dartにおいて特定の型を想定せずに変数を定義するには、varキーワードを使います。
var a = 1;
var b = 'abc';
定義の時に初期化を行わない場合、その値はnullになります。

varを使って定義した変数は動的な型(厳密にはDynamic型)になり、どのような型のオブジェクトでも代入することができます。初期化のときに設定した値とは別の型でもかまいません。
var a = 1;
a = 'abc'; // 問題なし
またDartには、boolintdoubleなどのインターフェイスが標準のライブラリ dart:core に用意されています。Dartでは、varを使って定義した変数だけではなく、どんな型を使って定義した変数であっても、すべての型の値が代入できます。つまり次のようなコードでも文法上は問題ないというわけです。
int a = 1;
a = true; // intで定義した変数aにboolの値を代入している。
a = new List(); // intで定義した変数aにListのオブジェクトを代入している。
String b = 2; // Stringで定義した変数bを整数2で初期化している。
変数aは型intを使って定義されていますが、bool型であるtrueやList型のオブジェクトも問題なく代入できます。つまり変数の定義時にどのような型を指定しても動的な型として扱われ、他のあらゆる型のオブジェクトも代入することができます。

ここでは代入のみ例に出しましたが、関数の呼出しパラメーターや、関数からの戻り値でも同様です。つまりパラメーターにint型の値を受けとると指定された関数にtrueを渡せますし、戻り値としてint型を返すと指定された関数がList型のオブジェクトを返すことも可能です。

ここまでは普通にDartのコードを実行した時の説明でした。Dartにはこれとは別に、型のチェックを有効にするモードがあります。上で見たような型チェックを行わないモードを「プロダクション モード(production mode)」、型のチェックを行うモードを「チェック モード(checked mode)」と呼びます。
int a = 1;
a = true; // エラー
a = new List(); // エラー
String b = 2; // エラー
var c = 1;
c = true; // 問題なし
c = new List(); // 問題なし
チェック モードでは、変数を定義したときと別の型の値を代入しようとするとエラーになります。ただしチェック モードでも、var型の変数はどのような型の値を代入してもエラーになりません。

Dartboard では、左上の「Checked Mode」のチェックを入れるとチェック モードになります。

チェック モードの型チェックは、コンパイル時と実行時の両方で行われます。コンパイル時にはコード上で明らかに分かるエラーのみチェックされ、あとは実行時にチェックが行われます。実行時にエラーを検出するとその場で動作は停止します。

プロダクション モードはチェックが行われませんので、プログラムの実行が停止することはありません。もし実行に影響のある問題が起きた場合は、例外が発生します。たとえばある型を想定してメソッドを呼び出したがそのような名前のメソッドは存在しなかったときには、NoSuchMethodException が発生します。


こちらもどうぞ

0 件のコメント:

コメントを投稿