在 Haxe 中,如果 null
是某個(gè)類(lèi)型的合法值,則該類(lèi)型被認(rèn)為是可空的。
Haxe 的目標(biāo)語(yǔ)言對(duì) null
的處理方式不同,因此需要區(qū)分兩種類(lèi)型的目標(biāo)語(yǔ)言:
定義:靜態(tài)目標(biāo)
靜態(tài)目標(biāo)使用自己的類(lèi)型系統(tǒng),其中基本類(lèi)型不允許null
值。這包括 Flash、C++、Java 和 C# 目標(biāo)。
定義:動(dòng)態(tài)目標(biāo)
動(dòng)態(tài)目標(biāo)對(duì)類(lèi)型更為寬松,允許基本類(lèi)型具有null
值。這適用于 JavaScript、PHP、Neko 和 Flash 6-8 目標(biāo)。
在動(dòng)態(tài)目標(biāo)上使用 null
時(shí)無(wú)需擔(dān)心,但在靜態(tài)目標(biāo)上可能需要特別注意?;绢?lèi)型在靜態(tài)目標(biāo)上會(huì)初始化為默認(rèn)值。
定義:默認(rèn)值
在靜態(tài)目標(biāo)上,基本類(lèi)型的默認(rèn)值如下:
-Int
:0
-Float
:在 Flash 上為NaN
,在其他靜態(tài)目標(biāo)上為0.0
-Bool
:false
在靜態(tài)目標(biāo)上,不能將 null
賦值給基本類(lèi)型。為了允許 null
,需要將基本類(lèi)型包裝為 Null<T>
:
// 在靜態(tài)平臺(tái)上會(huì)報(bào)錯(cuò)
var a:Int = null;
// 允許
var b:Null<Int> = null;
同樣,基本類(lèi)型不能與 null
進(jìn)行比較,除非它們被包裝為 Null<T>
:
var a:Int = 0;
// 在靜態(tài)平臺(tái)上會(huì)報(bào)錯(cuò)
if (a == null) { ... }
var b:Null<Int> = 0;
if (b != null) { ... } // 允許
這種限制適用于所有執(zhí)行類(lèi)型統(tǒng)一的情況。
定義:
Null<T&
在靜態(tài)目標(biāo)上,可以使用Null<Int&
、Null<Float&
和Null<Bool&
來(lái)允許null
作為值。在動(dòng)態(tài)目標(biāo)上,這沒(méi)有效果。Null<T&
也可以與其他類(lèi)型一起使用,以表明允許null
值。
如果 null
被隱藏在 Null<T>
或 Dynamic
中并賦值給基本類(lèi)型,則會(huì)使用默認(rèn)值:
var n:Null<Int> = null;
var a:Int = n;
trace(a); // 在靜態(tài)平臺(tái)上輸出 0
在 Haxe 中,null
的使用取決于目標(biāo)平臺(tái)。在動(dòng)態(tài)目標(biāo)上,基本類(lèi)型可以是 null
;但在靜態(tài)目標(biāo)上,需要使用 Null<T>
來(lái)允許 null
值。了解默認(rèn)值的概念也很重要,尤其是在處理靜態(tài)目標(biāo)時(shí)。
如果你對(duì) Haxe 的可空性感興趣,可以通過(guò)編寫(xiě)簡(jiǎn)單的代碼來(lái)練習(xí)如何在不同平臺(tái)上處理 null
值!
更多建議: