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
這讓我很困惑。為什么會這樣?
編輯:我剛剛意識到它不一定是空的
uj5u.com熱心網友回復:
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 沒有==on List(或其他集合)遞回地檢查兩個串列是否包含相同(或相等)的元素。它只說true如果它是完全相同的物件。
如果你想檢查 list-element-equality,你可以使用Equality來自的類package:collection,likeListEquality和自定義 hash/equals 引數到 hash map/set 類。例子:
const intListEquality = ListEquality<int>();
var listMap = LinkedHashMap<List<int>, String>(
equals: intListEquality.equals,
hashCode: intListEquality.hash);
listMap[[1]] = "42";
print(listMap([1]); // 42
uj5u.com熱心網友回復:
它與Dart的相等性檢查有關。他們不根據值評估相等性,而是使用hashCodes。
如果您在 Flutter 的背景關系中使用 Dart,您可以使用原生 Flutter 方法listEquals使用 Lists 進行基于值的比較。
如果你想要基于價值的平等,Objects你必須或使用像Equatableoverride這樣的包來幫助你。== operator
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/475436.html
下一篇:鑄造復雜JSON飛鏢
