Haxe入門 / Nullability
2.2 Nullability
Definition of nullable
型がnullableであるとは、その型のインスタンスがnull
を持てるということ(意訳)
nullableかどうかはターゲットとする言語によって違う
基本型がnullableかどうか(nullを持てるか)はターゲットとする言語によって変わる。例えば、C++,Java,C#などの静的型システムを持つ言語(静的型言語)だと基本型はnullableじゃない(nullをとれない)。対して、JavaScript、PHPなどの動的型システムを持つ言語(動的型言語)は基本型もnullable(nullを持てる)。だから動的型言語だとあまり気にしなくていいけど、静的型言語だと注意しよう。静的型言語だと基本型はnullableじゃない。
実際、
var a:Int = null;
とすると、動的型言語だとコンパイルが通る。静的型言語だと
On static platforms, null can't be used as basic type Int
というエラーが出る。
とは言っても、動的型言語か静的型言語か意識しなければならないというのはHaxeを使う意味が薄れるというもの。Intにnullを持たせたいこともあるだろう。そういう場合はNull<T>
を使う。
var b: Null<Int> = null; var c: Null<Int> = 1;
これは動的型言語でも静的型言語でも通る。
比較演算でも
var a:Int = 0; if(a==null) { ... }
はエラーになるが、
var a:Null<Int> = 0; if(a==null) { ... }
はエラーにならない。
Null
var a:Null<Int> = null; var b:Int = a;
ただしこの挙動はターゲットとする言語によって異なる。静的型言語だとb==0
となるが、動的型言語だとb==null
となる。
2.2.1 Optional Arguments and Nullability Optional引数とNullability
詳しくは2.6.1 Optional Argumentsで説明。ここでは簡単に。
Haxeでは関数呼び出しで引数を省略する方法が2つある。
- Optional Arguments (オプショナル引数)
- Defalut values (デフォルト引数)
オプショナル引数を使った関数定義では、引数指定を省略するとnullが渡される。一方、デフォルト引数では関数定義時に引数が省略された場合の値を指定できる。こう書くと、デフォルト引数の方が汎用的で良いと思うかもしれないが、オプショナル引数は型システムを利用した引数の省略方法で、デフォルト引数はそうではないとか。だからデフォルト引数は、パフォーマンス的に悪いこともあるらしい(私が誤解してる可能性あるので信じないこと)。
オプショナル引数はnullになるかもしれないので、当然nullableである。nullableがわかんない人はこの記事の最初に戻ること。
オプショナル引数の使い方は関数定義時に、変数の前に?(question-mark)を置く。
function foo(?x: Int) { ... }
xはnullableではなくてはいけないので、xの型はNull<Int>
になる。静的型言語ではIntはnullableではないことに注意。もちろん
function foo(?x: Null<Int>) { ... }
と書いても同じ。でもわざわざNull<Int>
と書かなくてもオプショナル引数だから勝手にそうなる。