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