haxe uninitialized成员变量跨平台不一致

时间:2014-06-13 23:20:54

标签: javascript flash porting haxe static-initialization

我正在尝试使用openfl和haxe将用haxe编写的现有Flash应用程序交叉编译成javascript。

在闪光灯下,我可以执行以下操作:

class foo
{
    var bar : Int;

    public function new()
    {
        trace(bar); //under flash prints 0, under javascript undefined
    }
}

当编译为javascript而不是0时,我得到Undefined。

我的问题是,如果成员变量未被构造函数初始化,我是否可以编译打印警告/错误。

我可以做得更好haxe我做到了这样haxe会在js为0时为我初始化它们。

与Bool = false,Float = 0等相同的故事,我还没有测试,但也可能使用Object = null。

该应用程序有144个类,超过20k行代码。手动查找和添加显式初始化程序将花费大量时间,这就是为什么我在寻找替代方案。

3 个答案:

答案 0 :(得分:4)

为什么你不这样做:var bar:Int = 0;除非你有一个特别的情况,它真的很重要(我遇到过)它不应该是一个大问题:)

答案 1 :(得分:0)

如果其他人有这个问题。我通过使用sed和正则表达式来查找和替换源树中所有未初始化的变量来解决这个问题。

在源代码树的根目录下,我在ubuntu下运行了以下命令。

find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*Int\s*\);/\1 = 0;/g"
find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*UInt\s*\);/\1 = 0;/g"
find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*Bool\s*\);/\1 = false;/g"
find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*Float\s*\);/\1 = 0;/g"
find . -print0 -name "*.hx" | xargs -0 -n1 sed -i -e "s/\(var [^:]\+:\s*[^=]\+\s*\);/\1 = null;/g"

那将取代

var [variableName] : Int;  

var [variableName] : Int = 0;

类似于UIntBoolFloat。所有其他类型都设置为null。

我没有为var [varName];写一个,因为我的源代码树中只有4个实例。

答案 2 :(得分:0)

如前所述,记录在案:haxe.org/manual/types-nullability.html。原因很简单:速度。

但有几点需要注意。

在javascript中,您可以在不降低速度和文件大小略有增加的情况下解决这个问题。它甚至使代码实际运行得更快。您可以通过将默认值设置为对象原型来实现,这反过来可以通过使用自定义js生成器功能完成。

对于其他平台,我认为没有这样的方式,因此唯一要采用的是动态初始化。但不要害怕!宏在这里为您服务。编写一个宏可以很容易地通知你未初始化的值,并且很容易编写宏来为你初始化它们。

但说实话,我没有看到很多问题,也许你高估了它?我和haxe一起工作多年,每天,我从来没有遇到任何严重的问题。大部分时间它都不会打扰你,因为你通常会动态地初始化事物,而如果你不这样做,这样的问题通常需要5秒才能解决。当然只是恕我直言。