【发布时间】:2022-11-18 16:29:09
【问题描述】:
我了解到什么是 Equatable 以及如何使用它。但我只是想知道我为什么要使用它?
我找到了一些原因。其中之一,当我们想要比较来自任何类的 2 个或更多相同对象时,它将使用。由于哈希码,即使它们的属性相同,它们也不相同。但是equatable相互比较没有哈希码。
但我真的很想知道在现实生活中我会在哪里使用?
非常感谢..
【问题讨论】:
标签: flutter dart package hashcode equatable
我了解到什么是 Equatable 以及如何使用它。但我只是想知道我为什么要使用它?
我找到了一些原因。其中之一,当我们想要比较来自任何类的 2 个或更多相同对象时,它将使用。由于哈希码,即使它们的属性相同,它们也不相同。但是equatable相互比较没有哈希码。
但我真的很想知道在现实生活中我会在哪里使用?
非常感谢..
【问题讨论】:
标签: flutter dart package hashcode equatable
假设我们有这个 user 类模型:
class User extends Equatable {
final String fullName;
final int phone;
const User({
required this.fullName,
required this.phone,
});
@override
List<Object?> get props => [fullName, phone];
}
我们有这些变量:
var myUser = User(fullName: 'Amir', phone: 123456);
List<User> users = [
User(fullName: 'Amir', phone: 123456),
User(fullName: 'Amir 2', phone: 5353453),
User(fullName: 'Amir 3', phone: 78978978),
];
现在我们想在我们的users 中搜索,如果myUser 在用户列表中,则将其删除:
users.remove(myUser);
如果我们不在User上使用Equatable,我们就能找到它。但现在我们可以。
【讨论】:
默认情况下,2 个引用对象通过引用进行比较,这意味着如果您将创建两个相等的对象并尝试进行比较,它们将是不同的,因为引用不同并且您已手动检查每个字段与另一个对象的每个字段。关于equals和hasCode概念的详细信息,可以阅读here。
因此,如果对象没有特定的equals和hashCode,那么您不能在Set、Map、HashTables和其他数据结构中使用此类对象。
另一个真实的例子是单元测试。编写必须将实际结果与预期结果进行比较的测试会让您感到非常疲惫,因为在每次测试中您都必须比较每个字段,而不仅仅是使用 equivalency 运算符 (==)。
请记住,这不是 dart 功能,这是一个标准接近计算机科学和数据结构.
【讨论】: