我是Dart的新手,所以也许我在这里遗漏了一些东西:
这有效:
在我的main()
中,我有这个:
var a = _someFunction;
var b = _someFunction;
print("${a == b}"); // true. correct!
_someFunction
是另一个顶级函数。
这不起作用:(至少不是我期待它的方式)
鉴于此课......
class Dummy {
void start() {
var a = _onEvent;
var b = _onEvent;
print(a == b); // false. ???????
}
void _onEvent() {
}
}
从main()
实例化并调用其start()
方法会导致false
。显然,只要我的代码获得对_onEvent
的引用,就会创建并返回某个函数或闭包对象的新实例。
这是故意行为吗?
我希望获得对同一实例的相同方法的多个引用每次都返回相同的对象。也许这是出于某种原因。如果是这样;什么理由?或者这可能是VM的错误/疏忽/限制?
感谢您的任何见解!
答案 0 :(得分:1)
目前,这种行为似乎是故意的,但自2012年5月以来,以下缺陷仍然存在:https://code.google.com/p/dart/issues/detail?id=144
答案 1 :(得分:1)
如果我猜,我会说设置“var a = _onEvent;”创建一个绑定方法,它是某种包含函数以及此函数的对象。您要求绑定的方法是规范化的。但是,这需要团队创建它们的地图,这可能会导致对内存泄漏的担忧。
我认为他们制作了“var a = _someFunction;”早期工作,因为他们需要静态函数作为常量,以便可以将它们分配给consts。这样他们就可以写出如下内容:
const logger = someStaticLoggingFunction;
这是在静态评估静态之前的几天。
无论如何,我会说比较闭包是否相等是大多数语言的边缘情况。带上一粒盐就可以了。根据我对系统的了解,这是我最好的猜测。据我所知,语言规范没有说明这一点。
实际上,现在我读过(https://code.google.com/p/dart/issues/detail?id=144),讨论实际上非常好。我上面写的大致与之匹配。