変数の確保は言語によって「静的型付け」と「動的型付け」など種類があります。
動的型付けとは?
GML の変数は動的型付け
で、この方式では変数のデータ型を宣言時には定義しません。
実際にデータが入るまでデータ型は決定されず、宣言された時点では特定の型を持っていません。変数にこれから何が入るのか何の目的で確保された変数なのかが宣言された時点ではまだ不明です。
変数にデータを入れる際に毎回データ型が評価され型が決定されるので、最初に文字列を入れた変数にあとから数値を入れて利用することが可能です。変数として使っていたものを配列として使うこともできます。
var a,b;
// この時点では宣言のみで変数の型は決まっていないa=100; b=1;
// 最初に数値を入れました(型は実数型に決定された)a+=b;
// 足し算の結果を変数 a に代入b="文字列";
// 変数 b に文字列を入れました(型は文字列型に決定された)draw_text(x,y,"A is Num = "+string(a)+" : b is Str ="+b);
上記コードでは最初に二つの変数を宣言し、最初二つに実数型としてデータを入れ計算をし、途中から片方の変数には文字列を入れて、最後に二つの変数の持つデータを draw_text
関数で画面に出力しました。
実数型の変数 a
は文字列と連結した表示のためにはキャスト(型変換)が必要になるため、+string(a)
が必要に成ります。
変数 b
は最初は実数型だったので数値型同士だから a+b
が成り立つけど、途中から文字列型になったので文字列と連結するのにキャストが不要です。
では
var c=a+b;
これを上記コードの最後に足すと何が起こるでしょう。
コードエディタの構文チェック機能は構文のみをチェックするため変数型の不一致を検出しません。そもそも変数に何が入るのか予め決められていないため、数値+文字列という型の不一致を IDE の側では検出できないのです。
var c=a+b;
は型の不一致で不正ですがコンパイラは通るし実行もできます。
ただし該当ラインを処理した時点で Fatal Error (致命的エラー)となるため、文字列の描画に至らずアプリケーションは実行を中断されます。正確に動作を観察したい場合はデバッガを使って該当ラインにブレークポイントを設置し、デバッグモード(F6)でコンパイル実行後、ブレークポイントまでは正常に動作していることがデバッガから確認できます。そして該当ラインを処理する時点でエラーを出して終了という流れになります。
つまりコンパイラも型の不一致は検出できないし、ビルドして実行してみないと型の不一致が原因のエラーは分からない、これが動的型付けの問題点でもあります。