我开始学习Haxe,我想知道Haxe是强类型还是弱类型。如果它的类型系统不强或弱,那么它是“可选类型”,如Dart programming language?
我注意到这行代码似乎有效,尽管没有明确的类型声明:var a = [["This is a nested array"], ["This is another nested array"], "This is not a nested array" ];
答案 0 :(得分:4)
Haxe在很大程度上是一种严格类型的语言,然而,它并不像你期望的那样严格。它比其他语言宽松得多,并允许您在必要时突破类型系统。并且它不需要您每次都指定所有类型 - 编译器使用类型推断来“推断”类型 - 在您的示例中,推断类型为Array<Dynamic>
与Haxe:
编译器默认为强类型。您可以提供类型信息(例如var x:Array<Int>;
),也可以让编译器推断(例如var x = [0,1,2]
,x将是Array:Int
)。
您可以使用$type(myVariable);
检查推断类型。这有助于弄清楚发生了什么。
如果类型推断让您感到困惑,或者编译器感到困惑,有时可能更容易明确定义您的类型,因此不会产生混淆。
您可以使用Dynamic,Reflection或{{来逃避类型系统(如果它妨碍了,或者如果您尝试使用本机库等) 3}}。
Haxe的Type Checking主要是编译时功能。编译代码时,会检查类型并确保其正确无误。如果你试图在运行时做一些奇怪的事情,不会发生类型检查,你可能会破坏事情。
一些Haxe的目标是弱类型的(例如Javascript,Neko)。但是,因为Haxe的类型检查在编译时发生,所以您可以获得严格类型语言的所有好处 - 错误检查,自动完成等。编译的Javascript或Neko字节码不会知道类型,但这无关紧要 - Haxe确保一切正常。
为了帮助您解决问题,请点击以下链接:
答案 1 :(得分: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>
由此可以看出,编译器正确识别了两个数组和一个字符串的混合,并将其解析为Dynamic数组,这意味着该数组基本上可以保存任何抛出的对象。
因此,您的变量定义
var a = [["This is..."], ["This is another..."], "This is not..." ];
完全是同义词,包括显式类型定义:
var a:Array<Dynamic> = [["This is..."], ["This is another..."], "This is not..." ];