Haxe中函数绑定和getter的可能错误?

时间:2015-03-26 17:27:36

标签: haxe

刚刚在Haxe遇到了这个问题,并想知道这是一个错误还是故意这样做...

我正在绑定一个打印时间戳的函数。这种情况下的时间戳是我的全局类中的getter。我期望如果我等待几秒然后调用绑定函数,它将在绑定函数时使用getter的值。情况并非如此。相反,似乎每次调用getter来获取当前值。

如果我从使用getter切换到普通函数调用以获取我的timestamp作为我的参数,我检查是否会发生这种情况。后者按预期工作。

function printTime(time:Int):Void {
    trace("The time is: " + time);
}

var p:Void->Void = printTime.bind(Globals.timestampgetter); 
var p2:Void->Void = printTime.bind(Global.timestampfunc());
// wait 5 seconds
p(); // prints CURRENT timestamp, i.e. adds the 5 seconds that passed
p2(); // prints time at which printTime.bind was called

修改 忘了提...我正在使用Haxe 3.1.3和OpenFL 3.0.0 beta,编译为Flash目标。

3 个答案:

答案 0 :(得分:3)

经过多次尝试后,我将测试用例缩减为以下内容,我可以确认它是Flash生成器中的错误。我在这里报告了它:https://github.com/HaxeFoundation/haxe/issues/4089

class Test {
    static function main() {
        function printTime(time:Float)
            trace("The time is: " + time);
        timestamp = timestampfunc();
        var t = timestampfunc();
        var p1 = printTime.bind(timestamp); 
        var p2 = printTime.bind(t); 
        var p3 = printTime.bind(timestampfunc());
        p1();
        p2();
        p3();

        haxe.Timer.delay(function() {
            t = timestamp = timestampfunc();

            p1();
            p2();
            p3();
        }, 1000);
    }
    public static var timestamp : Float;
    static function timestampfunc() return Date.now().getTime();
}

答案 1 :(得分:2)

我尝试了你的代码,它对我来说是预期的。这些值设置为bind时间,即使您延迟调用pp2,也不会更改。

以下是我测试的代码:

class Test {
    static function main() {
        function printTime(time:Float):Void {
            trace("The time is: " + time);
        }

        var p = printTime.bind(Test.timestampgetter); 
        var p2 = printTime.bind(Test.timestampfunc());
        p();
        p2();

        haxe.Timer.delay(function() {
            p();
            p2();
        }, 1000);
    }

    public static var timestampgetter(get, null) : Float;

    static function timestampfunc() return Date.now().getTime();
    static function get_timestampgetter() return Date.now().getTime();
}

您可以在此处自行测试:http://try.haxe.org/#C85Ce

答案 2 :(得分:2)

有趣......问题似乎源于使用"默认"而不是"得到"对于吸气剂。

佛朗哥的代码有效。但是这段代码并没有:

class Test {
    static function main() {
        function printTime(time:Float):Void {
            trace("The time is: " + time);
        }

        updateTimestamp();
        var p = printTime.bind(Test.timestampgetter); 
        var p2 = printTime.bind(Test.timestampfunc());
        p();
        p2();

        haxe.Timer.delay(function() {
            p();
            p2();
        }, 1000);
    }

    static function updateTimestamp():Void {
        timestampgetter = Date.now().getTime();
        haxe.Timer.delay(updateTimestamp, 1000);
    }

    public static var timestampgetter(default, null) : Float;

    static function timestampfunc() return Date.now().getTime();
    static function get_timestampgetter() return Date.now().getTime();
}