Haxeといえば、強力な型システムが売りの1つではありますが、昨今叫ばれているNull安全があまり強力ではありません。
一応、Int
、Float
、Bool
についてはnullを許容するという宣言をしない限りnullを代入することは出来ません。
// これらのコードはコンパイルエラー
var a: Int = null;
var b: Float = null;
var c: Bool = null;
他の型についてはnullがぬるぬる1と代入出来てしまいます…
// コンパイルが通ってしまう!
var a: String = null;
var b: Date = null;
どうすればいいのか?
haxeにはOption<T>という型が標準で付属しているので、nullの可能性がある箇所には全てOption<T>タイプを宣言してあげるようにするのが安全です。
import haxe.ds.Option;
// Optionタイプでラップしない型は代入出来ない
var a: Option<String> = "a";
var b: Option<String> = null;
// Some, Noneを利用すれば代入出来る
var c: Option<String> = Some("a");
var d: Option<String> = None;
上記のコードだと良さが分からないと思うので、関数の引き数にOption<T>を取ることを考えてみます。
import haxe.ds.Option;
function say(greet: Option<String>) {
switch (greet) {
case Some(v):
trace("Hello " + v);
case None:
trace("挨拶しません");
}
}
このように関数を定義しておくと、常にnull(というかNone)のケースを考慮してコードを書く必要が出てくる上に、型チェックが効くのでif (var == null) { ... }
のようなコードの書き漏れがなくなります。
Option<T>
タイプ、しっかり活用していきたいですね。
-
これが書きたかったんだ、ごめんね ↩