1

我开始学习 Haxe,我想知道 Haxe 是强类型还是弱类型。如果它的类型系统不强或不弱,那么它是否像Dart 编程语言那样“可选类型” ?

我注意到这行代码似乎可以工作,尽管没有明确的类型声明:var a = [["This is a nested array"], ["This is another nested array"], "This is not a nested array" ];

4

2 回答 2

4

Haxe 在很大程度上是一种严格类型的语言,然而,它并不像你想象的那么严格。它比其他一些语言宽松得多,并且允许您在必要时突破类型系统。并且它不需要您每次都指定所有类型 - 编译器使用类型推断来“推断”类型 - 在您的示例中推断的类型是Array<Dynamic>

使用 Haxe:

  • 编译器将默认为强类型。您可以提供类型信息(例如var x:Array<Int>;),也可以让编译器推断(例如var x = [0,1,2], x 将是Array:Int)。

  • 您可以通过使用来检查推断的类型$type(myVariable);这有助于弄清楚发生了什么。

  • 如果类型推断让您感到困惑,或者编译器感到困惑,那么显式定义您的类型有时会更容易,因此不会造成混淆。

  • 您可以使用DynamicReflectionuntyped来逃避类型系统(如果它妨碍了,或者如果您尝试使用本机库等)。

  • Haxe 的类型检查主要是编译时功能。编译代码时会检查类型并保证其正确性。但是,如果您尝试在运行时做一些奇怪的事情,则不会发生类型检查,并且您可能会破坏事情。

  • Haxe 的一些目标是弱类型的(例如 Javascript、Neko)。然而,因为 Haxe 的类型检查发生在编译时,您可以获得严格类型语言的所有好处 - 错误检查、自动完成等。编译后的 Javascript 或 Neko 字节码不会知道类型,但这没关系 - Haxe 确保一切正常。

为了帮助您了解它,这里有一些链接:

于 2012-11-22T01:18:21.827 回答
3

它是严格类型的,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>

从中,我们可以看到编译器正确地识别了您的两个数组和一个字符串的混合,并将其解析为一个动态数组,这意味着该数组基本上可以容纳抛出的任何对象。

因此,您的变量定义

var a = [["This is..."], ["This is another..."], "This is not..." ];

与以下完全同义,包括显式类型定义:

var a:Array<Dynamic> = [["This is..."], ["This is another..."], "This is not..." ];
于 2012-11-22T01:07:34.817 回答