刚刚在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目标。
答案 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
时间,即使您延迟调用p
和p2
,也不会更改。
以下是我测试的代码:
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();
}