2013-02-01 36 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),討論實際上是相當不錯的。我上面寫的大致匹配它。