2013-06-01 3 views
2

클래스의 멤버 함수가 같은지 테스트하려고합니다. 다음은 작은 샘플입니다.다트 멤버 함수 평등 규칙

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

빠른 응답을 보내 주셔서 감사합니다. 이것은 정확하게 내가 알아야 할 필요가있는 것입니다. –