我開始學習Haxe,我想知道Haxe是強類型還是弱類型。如果其類型系統不強或弱,那麼它是否「可選擇輸入」,如Dart programming language?Haxe是強類型還是弱類型(或者兩者都是?)
我注意到,這行代碼似乎工作,儘管沒有明確的類型聲明:var a = [["This is a nested array"], ["This is another nested array"], "This is not a nested array" ];
我開始學習Haxe,我想知道Haxe是強類型還是弱類型。如果其類型系統不強或弱,那麼它是否「可選擇輸入」,如Dart programming language?Haxe是強類型還是弱類型(或者兩者都是?)
我注意到,這行代碼似乎工作,儘管沒有明確的類型聲明:var a = [["This is a nested array"], ["This is another nested array"], "This is not a nested array" ];
HAXE是大部分嚴格的類型語言,然而,它並沒有你期望的那麼嚴格。它比其他一些語言寬鬆得多,並且允許您在必要時打破類型系統。它不要求你每次都指定所有類型的 - 編譯器使用類型推斷「推斷」類型 - 在你exampe推斷出的類型是Array<Dynamic>
隨着HAXE:
編譯器將默認爲強類型。您可以提供類型信息(例如,var x:Array<Int>;
),也可以讓編譯器推斷(例如,var x = [0,1,2]
,x將爲Array:Int
)。
您可以通過使用$type(myVariable);
來檢查推斷的類型這對於弄清楚發生了什麼很有幫助。
如果類型推斷讓您感到困惑,或者編譯器感到困惑,那麼有時可以更明確地定義類型,因此不會出現混淆。
可以逃脫類型系統(如果它礙事,或者如果你想有一個機庫等工作)使用或者Dynamic,Reflection或untyped。
Haxe的類型檢查主要是編譯時間功能。在編譯代碼時檢查類型並保證是正確的。如果你嘗試在運行時做怪異的事情,那麼不會發生類型檢查,並且你冒險破壞事情。
Haxe的一些目標是弱類型的(例如Javascript,Neko)。但是,由於Haxe的類型檢查是在編譯時發生的,因此您可以獲得嚴格類型的語言的所有好處 - 錯誤檢查,自動完成等。編譯的Javascript或Neko Bytecode不會了解類型,但這並不重要 - Haxe確保一切正常。
爲了幫助您得到您的頭周圍,這裏有一些鏈接:
它嚴格類型和HAXE編譯器類型推斷確實找到正確的類型數據的一個令人難以置信的工作。
按照這裏的例子:http://haxe.org/ref/type_infer - 試試這個絕招:
var a = [["This is a nested array"], ["This is another nested array"], "This is not a nested array" ];
var b = $type(a);
它會給你消息
Warning : Array<Dynamic>
從這個警告,我們可以看到,編譯器正確識別你的兩個數組和一個字符串的混合,並將其解析爲一個Dynamic數組,這意味着該數組基本上可以包含拋出它的任何對象。
因此,您的變量定義
var a = [["This is..."], ["This is another..."], "This is not..." ];
是以下一個完全同義,包括明確的類型定義:
var a:Array<Dynamic> = [["This is..."], ["This is another..."], "This is not..." ];
這和「鴨子打字」一樣嗎,還是有一些細微差別? –
鴨子打字說:「如果這看起來像一隻鴨子,像鴨子一樣游泳,像鴨子一樣呱呱叫,那是一隻鴨子。」 Haxe的班級制度並沒有這樣做 - 如果一個班級是必需的,它必須是該班級的一個實例,而不僅僅是一個類似的外觀對象。如果您確實想要使用Duck Typing(因此任何類似的外觀對象被認爲是有效的),您可以使用[Typedef](http://haxe.org/ref/type_advanced),然後使用類或匿名對象進行匹配它。 –
編譯器在喬納斯的例子中做的不是鴨子打字,而是實際推斷出類型。一旦編譯器決定了它認爲的類型(在這種情況下,Array
非常明確的答案,謝謝。 –