为什么std::cell::Ref没有Hash/PartialEq/Eq实现?

15

考虑到 std::cell::Ref 类型,它似乎基本上是一个指针。然而它没有实现HashPartialEq或者Eq特质。这些特质没有被添加的根本原因是什么?


3
"不进行解引用将允许其作为实际类型使用吗?" - Stargateur
2
我找到了这个相关问题,其中得出结论说:“我们认为目前没有清晰的实现方式,因为所有当前的策略都有缺点”,但没有详细说明。 - kmdreko
从相关问题中可以得知:“这些实现方式,如此添加,不会使 MutexGuard<i32> == i32 这样的东西成为可能,但这可能是我们想要解决的问题。然而,添加这个功能将排除 MutexGuard<i32> == MutexGuard<i32>”。 - smitop
1
@Stargateur - 如果你有一个 Ref<Foo>,那么问题不大(只需在两种情况前面加上 & 来进行解引用)。问题是当你有 Vec<Ref<Foo>>Option<Ref<Foo>>,或包含 Ref<Foo> 的结构体时,就会有很多样板代码。 - Neil Mitchell
1
我认为option拥有一个as_deref()方法。由于我很少使用Cell API,因此无法清楚地看到明显的用例。 - Stargateur
1个回答

0

Ref 类型提供了 Deref 特性来进行比较,因此您可以简单地对其进行解引用以检查相等性。类似的类型如 MutexGuardRwLockReadGuardRwLockWeiteGuard 也实现了 Deref,但没有实现任何 EqHash 等特性。

已经有一些关于在这些类型上实现这些特性的讨论,但是没有一种方法是可行的。所以它们从未被实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接