2013-02-01 35 views
1

我是新来的飞镖,所以也许我失去了一些东西:获取对同一个方法的多个引用=多个对象?

这工作:

在我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

能否请您分享提示您寻找到这种行为的用例?鉴于你正在尝试做什么,可能有一些体面的解决方法可供你使用。 –

+0

我正在添加方法引用作为事件处理程序,并尝试再次删除它们(从List中,由于每次实例不同而失败)。我阅读了一些变通方法,并最终选择在添加事件处理程序时将方法引用存储在“订阅”对象中,这很像Dart自己的“StreamSubscription”作品,我想。但是,我不喜欢这种行为...... – Torious

+0

感谢您的背景。以下是制作自己的流的示例,它可以帮助您使用内置类对事件,订阅等进行建模:http://stackoverflow.com/questions/14536437/how-do-you-create-a-stream在镖 –

回答

1

目前,该行为似乎是故意的,但下面的缺陷是开放的,因为2012年5月:https://code.google.com/p/dart/issues/detail?id=144

+0

只是为了澄清,这个问题是截至目前为止。如果您有一个需要此功能的引人注目的用例,请将其添加到问题中。我个人发现这种行为并不明显,但我不知道它是否会被重新审视。 –

1

如果我猜的话,我会说,设置“风险价值= _onEvent;”创建一个绑定方法,它是某种包含函数和对象的对象。你要求绑定方法是规范化的。但是,这需要团队创建它们的地图,这可能会导致对内存泄漏的担忧。

我认为他们做了“var a = _someFunction;”尽早工作,因为他们需要静态函数作为常量,以便可以将它们分配给常量。这样他们就可以写下如下内容:

const logger = someStaticLoggingFunction;

这是在天静进行评估懒惰之前。

在任何情况下,我会说,平等比较倒闭是一个边缘的情况下对大多数语言。采取所有上述的与一粒盐。根据我对系统的了解,这只是我最好的猜测。据我所知,语言规范并没有对此提出任何说明。

其实,现在我已经阅读(https://code.google.com/p/dart/issues/detail?id=144),讨论实际上是相当不错的。我上面写的大致匹配它。