【发布时间】: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:collection的DeepEquality也是我的推荐。)
标签: dart