【问题标题】:Equality operator in dart?飞镖中的等式运算符?
【发布时间】:2022-10-23 21:55:06
【问题描述】:

所以我有这个代码:

import 'package:quiver/core.dart';
class ZipItem<I1, I2>{
  I1 item1;
  I2 item2;

  ZipItem(this.item1, this.item2);
  
  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      (other is ZipItem &&
          item1 == other.item1 &&
          item2 == other.item2);

  @override
  int get hashCode => hash2(item1.hashCode, item2.hashCode);

当我运行像expect(ZipItem('a', 1), ZipItem('a', 1)); 这样的测试时,它通过了。但是,如果我尝试运行这样的测试:

 expect(ZipItem([1,2,3], ['a','b','c']), 
 equals(ZipItem([1,2,3], ['a','b','c'])));

它失败了,我不知道为什么。我认为这与可迭代的项目有关,但我不确定。如果有人可以帮助我,我将不胜感激:)。

【问题讨论】:

  • [2] 不等于 [2]。而这仅仅是开始。 :)
  • 我明白了,使用 == 运算符的 dart 中的列表不相等。我通过使用 item1.toString() == other.item1.toSting() 找到了解决方法。这是解决方法的强大解决方案,还是容易受到我可能不知道的其他事情的影响? @RandalSchwartz
  • 这是一个非常糟糕的解决方案。查看基础库中的 listEquals(flutter sdk 的一部分)。
  • 问题是,至少对于这个特定的类,我需要使用泛型类型来编写它,所以不幸的是 listEquals 不起作用,因为我将绑定到列表,与 mapsEquals 等一样。我可以创建一个长开关案例它检查不同的类型并使用它们适当的相等函数拦截它们。虽然我不知道这是否比调用 .toString() 并以这种方式检查两个对象的相等性更好。
  • 任何事物比调用toString 更好,甚至只是接受false,因为[1].toString() == ["1"].toString()。平等中的误报严格来说比相似对象之间缺乏平等更糟糕。后者你可以解决。前者会导致微妙和意想不到的错误。它也使hashCode 打破合约,因为相等的值应该具有相等的哈希码。 (但是是的,来自package:collectionDeepEquality 也是我的推荐。)

标签: dart


【解决方案1】:

collection package 有许多用于计算集合相等性(和哈希码)的实用程序。

在处理泛型类型时,DeepCollectionEquality 是最合适的,因为它根据提供给它的对象的类型使用正确的相等检查行为。

或者,您可能会发现equatable package 很有用。它旨在简化实现==hashCode 的过程,并实现开箱即用的集合相等性。

【讨论】:

    猜你喜欢
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2013-07-10
    • 2020-03-03
    • 2021-02-27
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多