企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
虽然 Haxe 有一个静态的类型系统,但这个类型系统实际上可以通过使用 Dynamic 类型关闭。一个 动态值可以被赋值给任何类型;而任何值都可以被分配到动态类型。这有一些缺点: * 编译器将不会再在接受指定类型的赋值、函数调用和其它构造中进行类型检查。 * 某些优化,特别是编译为静态目标语言时,将不能再被使用。 * 一些常见的错误,例如字段访问中的一个拼写错误,将不能在编译时被发现,可能会引发运行时的错误。 * 如果字段是通过 Dynamic 类型使用,[无用代码消除(第8.2节)](http://#) 不能检测使用到的字段 使用 Dynamic 类型可能引发运行时错误的例子非常容易出现。思考下面的两行代码到静态目标语言的编译: ~~~ var d:Dynamic = 1; d.foo; ~~~ 尝试在 Flash 播放器运行编译后的程序,会产生一个错误 ,属性 `foo` 在 数值类型中没有找到,而且没有默认值。不使用 Dynamic,这会在编译时被侦测到。 >[warning] **花絮**:Haxe 3之前的 Dynamic 类型推断 > Haxe 3 编译器从不推断一个类型为 Dynamic 类型,所以用户必须明确它。之前的 Haxe 版本曾经推断 数组为一个混合类型,如 `[1, true, "foo"]` 为 `Array<Dynamic>`。我们发现这个行为会引发太多的类型问题,因此在 Haxe 3 中移除了它。 应该尽量少的使用 Dynamic 类型,因为很多情况下都有更好的选择,但是有时候实际会用到它。Haxe [反射(第10.7节)](http://#) API中部分使用了 Dynamic 类型,而且有时候它是在处理编译时未知的自定义数据结构最好选择。当被用一个 [单形(第2.9节)](http://#) [统一(第3.5节)](http://#) 的时候,Dynamic 类型以一种特殊的方式运行。单形没有绑定到 Dynamic,这可以在如下例子中带来令人惊喜的结果: ~~~ class Main { static function main() { var jsonData = ’[1, 2, 3]’; var json = haxe.Json.parse(jsonData); $type(json); // Unknown<0> for (i in 0...json.length) { // Array access is not allowed on // {+ length : Int } trace(json[0]); } } } ~~~ 尽管 `Json.parse` 的返回类型是 Dynamic 类型,局部变量 `json` 的类型并没有绑定到动态类型,仍然保持了一个单形。然后它在 json.length 字段访问上被推断为一个 [匿名结构(第2.5节)](http://#),使后面的 `json[0]` 数组访问失败。为了避免这个问题,变量 `json` 可以通过使用 `var json:Dynamic` 显式的声明为 Dynamic 类型。 >[warning] **花絮**:标准库中的 Dynamic 类型 Dynamic 类型在 Haxe 3 之前非常频繁的使用在标准库中。随着 Haxe 类型系统的持续改进,Dynamic 类型的出现在通往 Haxe 3的版本被减少。