在Dart中,如何比较两个对象以查看它们是否是同一个实例?

时间:2013-08-25 11:59:32

标签: dart

假设我有一个包含许多实例变量的类。我想重载==运算符(和hashCode),以便我可以将实例用作映射中的键。

class Foo {
  int a;
  int b;
  SomeClass c;
  SomeOtherClass d;
  // etc.

  bool operator==(Foo other) {
    // Long calculation involving a, b, c, d etc.
  }
}

比较计算可能很昂贵,因此我想在进行计算之前检查other是否与this相同。

如何调用Object类提供的==运算符来执行此操作?

3 个答案:

答案 0 :(得分:10)

您正在寻找“identical”,它会检查2个实例是否相同。

identical(this, other);

更详细的例子?

class Person {
  String ssn;
  String name;

  Person(this.ssn, this.name);

  // Define that two persons are equal if their SSNs are equal
  bool operator ==(Person other) {
    return (other.ssn == ssn);
  }
}

main() {
  var bob = new Person('111', 'Bob');
  var robert = new Person('111', 'Robert');

  print(bob == robert); // true

  print(identical(bob, robert)); // false, because these are two different instances
}

答案 1 :(得分:4)

您可以使用identical(this, other)super == other

答案 2 :(得分:0)

在一个不同但相似的注释中,在框架调用检查对象之间的相等性的情况下,例如如果使用 list.toSet() 从列表中获取唯一元素,则 identical(this, other) 可能不是一个选择。那时该类必须覆盖 == operatorhasCode() 方法。

但是对于这种情况,另一种方法可能是使用 equatable 包。这节省了大量样板代码,当您有很多模型类时尤其方便。