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>[]
应该这样吗?说不绝对是最保险的!
==
对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
这与相等性检查有关飞镖。它们不基于值来评估相等性,而是使用hashCode
s。
如果你在Flutter的上下文中使用Dart,你可以使用原生的Flutter方法listEquals进行基于值的比较。
如果你想在其他Objects
上基于值相等,你必须在== operator
上设置override
,或者使用像Equatable这样的包来帮助你。