答:为什么list或map不分别等于[]和{}?

  • 本文关键字:list map list dictionary dart
  • 更新时间 :
  • 英文 :

void main() {
var a = [];
var b = [];
print(a == []);
print(a == b);

var c = ['c'];
print(c == ['c']);

var d = 'd';
print(d == 'd');
}
false
false
false
true

这使我困惑。为什么会这样?

编辑:我刚刚意识到它不一定是空的

Dart平台库通常选择不为可变集合(或一般的可变对象)提供本机==实现。

检查[] == []似乎很明显,但它们是不同的对象。

var l1 = [];
var l2 = [];
print(l1 == l2);
l1.add("an element");
print(l1 == l2);

你期望两个==s给出相同的结果吗?如果没有,那么:

var l1 = <int>[];
var l2 = <int>[];
var m = <List<int>>{l1}; // A set of lists.
print(m.contains(l2)); // true or false?
l1.add(1);
print(m.contains(l2)); // true or false?

在这些问题之上(其他语言也有这些问题),Dart实现了泛型。空的List<int>和空的List<num>不是同一个对象,运行时类型检查可以分辨出它们的区别。<int>[] == <num>[]应该这样吗?说不绝对是最保险的!

总而言之,Dart没有==List(或其他集合)递归检查两个列表是否包含相同(或相等)的元素。只有当是完全相同的对象时,它才会显示true

如果你想检查列表元素是否相等,你可以使用package:collection中的Equality类,比如ListEquality和自定义哈希/相等参数到哈希映射/集合类。例子:

const intListEquality = ListEquality<int>();
var listMap = LinkedHashMap<List<int>, String>(
equals: intListEquality.equals, 
hashCode: intListEquality.hash);
listMap[[1]] = "42";
print(listMap([1]); // 42

这与相等性检查有关飞镖。它们不基于值来评估相等性,而是使用hashCodes。

如果你在Flutter的上下文中使用Dart,你可以使用原生的Flutter方法listEquals进行基于值的比较。

如果你想在其他Objects上基于值相等,你必须在== operator上设置override,或者使用像Equatable这样的包来帮助你。

相关内容

  • 没有找到相关文章

最新更新