【问题标题】:Dart == operator and identical function does not yield true for 2 objects with same contentDart == 运算符和相同的函数不会为具有相同内容的 2 个对象产生 true
【发布时间】:2020-09-25 05:10:23
【问题描述】:

所以我一直在尝试按字段比较两个对象。

我注意到 dart 中没有 equals 方法。但是有identical 函数和== 运算符。

我似乎无法理解为什么没有 equals 方法。如果我想这样做怎么办?

class Name {
  String fname;
  String lname;

  String get firstName => this.fname;
  void set firstName(String fname) => this.fname = fname;

  String get lastName => this.lname;
  void set lastName(String lname) => this.lname = lname;

  Name({this.fname, this.lname});

  @override
  String toString() {
    return this.firstName + " " + this.lastName;
  }

  bool equals(Name n2) {
    return this.firstName == n2.firstName && this.lastName == n2.lastName
        ? true
        : false;
  }
}

void main(List<String> args) {
  Name n1 = new Name();
  n1.firstName = "James";
  n1.lastName = "Bond";

  Name n2 = new Name();
  n2.firstName = "James";
  n2.lastName = "Bond";

  print(n1.equals(n2)); // true
  print(identical(n1, n2)); // false
  print(n1 == n2); // false
}

我能做些什么而不是让自己成为平等的人。或者 dart 是否希望您手动执行此操作。

【问题讨论】:

    标签: oop dart


    【解决方案1】:

    identical 不会返回 true,即使您要比较的两个对象的名字和姓氏相同。那是因为它们不是相同的实例。每个实例都有自己的身份和哈希码。

    您可以覆盖 == 运算符和哈希码。然后,您将能够比较两个不同的实例。 Equatable-Package 已经为您做到了,因此您可以使用 == 运算符来比较两个不同的实例:https://pub.dev/packages/equatable

    【讨论】:

    • 谢谢。最重要的是我所追求的。我知道在 java 中我们有一个 equals 方法,但不确定是否可以在 dart 中覆盖运算符本身。
    • 是的,你可以在 Dart 中做到这一点,这篇文章可能会帮助你:medium.com/@dumazy/…
    【解决方案2】:

    你可以这样写代码

     @override
      bool operator ==(Object other) {
        if (other.runtimeType != runtimeType)
          return false;
       /// do smth
      }
    
      @override
      int get hashCode {
    
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 2018-01-11
      • 2018-11-22
      • 2018-05-22
      相关资源
      最近更新 更多