class SomeObject {
final List list;
final int integer;
SomeObject({required this.integer, required this.list});
@override
bool operator ==(Object other) {
if (other is SomeObject && integer == other.integer) {
if (other.list.length != list.length) {
return false;
}
for (int i = 0; i < list.length; i ) {
if (list[i] == other.list[i]) {
return true;
}
}
return false;
}
return false;
}
@override
// TODO: implement hashCode
int get hashCode => Object.hashAll(list);
}
void main(){
var b = SomeObject(integer: 4, list: [5, 6, 7]);
var c = SomeObject(integer: 4, list: [5, 6, 8]);
print(b == c);
這里相等運算子回傳 true 而它應該回傳 false 。我認為比較單個串列元素存在一些問題。
}
uj5u.com熱心網友回復:
在這部分考慮使用!=和回傳false:
for (int i = 0; i < list.length; i ) {
if (list[i] == other.list[i]) {
return true;
}
}
如果我們仔細查看它失敗的原因:
var b = SomeObject(integer: 4, list: [5, 6, 7]);
var c = SomeObject(integer: 4, list: [5, 6, 8]);
第一個回圈:i = 0
if (list[0] == other.list[0]) { // 5 == 5
return true; // it stops and immediately returns true
}
如果我們使用!=并回傳false,它會在索引處的元素i不相等時立即中斷回圈。
for (int i = 0; i < list.length; i ) {
if (list[i] != other.list[i]) {
return false;
}
}
最后一個回圈:i = 2
if (list[2] != other.list[2]) { // 7 == 8
return false;
}
但是如果你想要一個更短的方法來做到這一點:
import 'package:flutter/foundation.dart';
class SomeObject {
final List list;
final int integer;
SomeObject({
required this.list,
required this.integer,
});
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is SomeObject &&
listEquals(other.list, list) &&
other.integer == integer;
}
@override
int get hashCode => list.hashCode ^ integer.hashCode;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/400068.html
下一篇:如何創建小部件參考的映射?
