3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

HaxeAdvent Calendar 2016

Day 2

HaxeとNull

Posted at

Haxeといえば、強力な型システムが売りの1つではありますが、昨今叫ばれているNull安全があまり強力ではありません。

一応、IntFloatBoolについては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>タイプ、しっかり活用していきたいですね。


  1. これが書きたかったんだ、ごめんね

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?