Haxe是强类型还是弱类型(或两者都是?)

时间:2012-11-21 22:57:46

标签: types haxe

我开始学习Haxe,我想知道Haxe是强类型还是弱类型。如果它的类型系统不强或弱,那么它是“可选类型”,如Dart programming language

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

2 个答案:

答案 0 :(得分:4)

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

与Haxe:

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

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

  • 如果类型推断让您感到困惑,或者编译器感到困惑,有时可能更容易明确定义您的类型,因此不会产生混淆。

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

  • Haxe的Type Checking主要是编译时功能。编译代码时,会检查类型并确保其正确无误。如果你试图在运行时做一些奇怪的事情,不会发生类型检查,你可能会破坏事情。

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

为了帮助您解决问题,请点击以下链接:

  • untyped
  • Type Inference本指南是我了解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..." ];