2013-06-01 31 views
2

我試圖測試類的成員函數的相等性。這裏是一個小樣本:Dart成員函數相等規則

void main() { 
    var foo = new Foo();  

    if (foo.someFunc == foo.someFunc) 
    print("foo.someFunc == foo.someFunc"); 
    else 
    print("foo.someFunc != foo.someFunc"); 
}  

class Foo { 
    someFunc() { 
    } 
} 

這會打印「foo.someFunc!= foo.someFunc」。這裏的等號運算符應該測試內存中的函數是否是同一個對象(並且看起來應該是這樣)。我也嘗試使用相同的(foo.someFunc,foo.someFunc),但得到了相同的結果。爲什麼在這種情況下等號運算符不會返回true?

回答

4

這在部分Dart: Up and Running中進行了說明。

基本上,您每次使用foo.someFunc時都會創建不同的封閉。這就是他們不平等的原因。

+0

+1用於連接到相同的文檔和打我一記重拳。 ;) –

+0

+1也是;) –

+0

謝謝。這是有道理的理解,參考是封閉。 –

4

這解釋了here。最重要的部分是:

每次創建閉包時,該閉包都是一個新對象。

您可以將對象存儲在變量中以解決此問題。頂級函數和靜態方法按照您的預期工作。

void main() { 
    var foo = new Foo();  

    if (foo.someMethod == foo.someMethod) 
    print("foo.someMethod == foo.someMethod"); 
    else 
    print("foo.someMethod != foo.someMethod"); 

    var storedMethodClosure = foo.someMethod; 

    if (storedMethodClosure == storedMethodClosure) 
    print("storedMethodClosure == storedMethodClosure"); 
    else 
    print("storedMethodClosure != storedMethodClosure"); 

    if (someFunction == someFunction) 
    print("someFunction == someFunction"); 
    else 
    print("someFunction != someFunction"); 

    if (Foo.staticMethod == Foo.staticMethod) 
    print("Foo.staticMethod == Foo.staticMethod"); 
    else 
    print("Foo.staticMethod != Foo.staticMethod"); 
} 

void someFunction() { 
} 

class Foo { 
    someMethod() { 
    } 

    static staticMethod() { 
    } 
} 

此輸出:

 
foo.someMethod != foo.someMethod 
storedMethodClosure == storedMethodClosure 
someFunction == someFunction 
Foo.staticMethod == Foo.staticMethod 
+0

感謝您的快速回復。這正是我需要知道的。 –