鍋あり谷あり

テーマを決めずに適当に書いています。

MTASC の型検査

型検査がどうのこうのという小難しい話に参加させていただきます。よろしくお願いします。> id:soutaro
で。文体が変わり。
MTASC というか ActionScript は、動的な型の言語なので、変数宣言時に型を指定できるという新たな仕様は不自然だと私も思う(それとも私だけ?)。

なんだその型指定ってのは、と思い

var i:Number="foo";

と書くと、コンパイル時に

type error String should be Number*1

というエラーが出るので、なんかちゃんとしているのかなという気分になる。
しかし。

function typetest()
{
  for( var i=0 ; i<6 ; ++i ){
    var a = [ 10, "foo", [1,2], true, function(){}, _root ];
    var s:Number = a[i];
    m_textfield.text += typeof(s)+"{"+s+"}, ";
  }
}

というコードは、あっさりコンパイルできる(m_textfield には、TextField が入っている)。
それどころか。
実行するとテキストフィールドの中身は

number{10}, string{foo}, object{1,2}, boolean{true}, function{[type Function]}, movieclip{_level0},

になる。
なんだそりゃ。
この結果から、どうもコンパイル時にしかチェックしていないらしいということがわかる。
Number 型だと指定されている変数に "foo" とかを代入しようとしたら例外が飛んでくるか、そうでなくとも代入に失敗して undefined になるとか、そんなことを期待していたんだが、どうもそうではなく、Number 型であることなど意に介さずに普通に実行できるらしい。

そうすると

型検査が通らないプログラムを弾かないとしたら、型検査する意義はどこにあるのでしょうか。最適化につかうというのはありえる。
( id:yoriyuki:20050806:p3 )

という疑問もわいてくる。

私見では、最適化になんか使っておらず、実際たいした意義はないのではないかと思う。
ただ単に、ケアレスミスをちょっと減らせるだけではないかと。

型指定をいくら書いても型違いになりうるのは正直どうかと思うが、書いた方が若干安全かなとも思うので、最近は書くようにしている。
ちょっとどうかと思いながら。

*1:このエラーメッセージ、なんか不自然な文言のような気がするがどうなんだろう。