如何对Dart Record进行深度相等性比较?
Dart 3 Record 深度相等性比较方案
Dart 3 新增的 Record 类型使用==运算符时会逐字段比对,但字段如果是 List、Map 这类引用类型,即便内容完全一致,比较结果也会是false:
final record1 = ([1, 2],); final record2 = ([1, 2],); print(record1 == record2); // 输出 false
要实现 Record 的深度相等性比较,可以用以下两种方式:
1. 手动实现递归比对函数
自己编写工具函数,递归遍历 Record 的每个字段,针对集合类型(List、Map)和嵌套 Record 做深度校验,基础类型直接用==判断:
bool deepEquals(Object? a, Object? b) { // 基础相等直接返回true if (a == b) return true; // 比对List if (a is List && b is List) { if (a.length != b.length) return false; for (int i = 0; i < a.length; i++) { if (!deepEquals(a[i], b[i])) return false; } return true; } // 比对Map if (a is Map && b is Map) { if (a.length != b.length) return false; for (final key in a.keys) { if (!b.containsKey(key) || !deepEquals(a[key], b[key])) return false; } return true; } // 比对Record if (a is Record && b is Record) { final aFields = a.$fields; final bFields = b.$fields; if (aFields.length != bFields.length) return false; for (int i = 0; i < aFields.length; i++) { if (!deepEquals(aFields[i], bFields[i])) return false; } return true; } // 其他未覆盖类型返回false return false; } // 使用示例 void main() { final record1 = ([1, 2], {'name': 'dart'}); final record2 = ([1, 2], {'name': 'dart'}); print(deepEquals(record1, record2)); // 输出 true }
2. 借助第三方库简化实现
可以使用 Dart 官方维护的collection包中的DeepCollectionEquality工具,配合 Record 的字段遍历实现深度比对:
首先在pubspec.yaml中添加依赖:
dependencies: collection: ^1.18.0
然后编写比对函数:
import 'package:collection/collection.dart'; bool deepRecordEquals(Record a, Record b) { final equalityChecker = DeepCollectionEquality(); final aFields = a.$fields; final bFields = b.$fields; if (aFields.length != bFields.length) return false; for (int i = 0; i < aFields.length; i++) { if (!equalityChecker.equals(aFields[i], bFields[i])) return false; } return true; } // 使用示例 void main() { final record1 = ([1, 2, [3]], {'id': 100}); final record2 = ([1, 2, [3]], {'id': 100}); print(deepRecordEquals(record1, record2)); // 输出 true }
注意事项
- 如果 Record 中包含自定义类,需要确保该类正确实现了
==运算符和hashCode方法,否则深度比对会失效; - 递归比对要注意循环引用的场景,可能会导致栈溢出,必要时需添加循环引用检测逻辑。
内容的提问来源于stack exchange,提问作者goodonion
相关产品推荐
相关产品推荐

