【问题标题】:Is Haxe strongly typed or weakly typed (or is it both?)Haxe 是强类型还是弱类型(或者两者兼而有之?)
【发布时间】:2012-11-21 22:57:46
【问题描述】:

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

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

【问题讨论】:

    标签: types haxe


    【解决方案1】:

    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 确保一切正常。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这和“duck typing”是一样的,还是有一些细微的差别?
      • 鸭子打字说“如果这看起来像一只鸭子,像鸭子一样游泳并且像鸭子一样嘎嘎叫,它就是一只鸭子”。 Haxe 的类系统不这样做 - 如果需要一个类,它需要是该类的一个实例,而不仅仅是一个外观相似的对象。如果您确实想使用 Duck Typing(因此任何看起来相似的对象都被认为是有效的),您可以使用 Typedef,然后使用类或匿名对象来匹配它。
      • 编译器在 Jonas 的例子中所做的不是鸭子类型,而是实际上推断类型。一旦编译器决定了它认为的类型是什么(在本例中为 Array),它就会充当严格类型的变量。
      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 2011-10-16
      • 2016-09-22
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多