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」が出力されます。ここでの等価演算子は、関数がメモリ内の同じオブジェクトであるかどうかをテストする必要があります (そして、そうあるべきだと思われます)。この場合、等値演算子が true を返さないのはなぜですか?

4

2 に答える 2

4

これについては、こちらで説明しています。最も重要な部分は次のとおりです。

クロージャーを作成するたびに、そのクロージャーは新しいオブジェクトになります。

これを回避するために、オブジェクトを変数に格納できます。トップレベルの関数と静的メソッドは期待どおりに機能します。

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
于 2013-06-01T19:26:17.307 に答える
4

これはDart: Up and Runningのfunction equalityセクションで説明されています。

基本的に、 を使用するたびに異なるクロージャーを作成しますfoo.someFunc。それが彼らが平等ではない理由です。

于 2013-06-01T19:25:21.657 に答える