我想写一个有内存大小限制的 LRU 缓存,而不是 std 中的“对象数”限制。自己想办法后,自己作弊看了看an existing implementation ,我几乎理解它,但这阻止了我:
struct KeyRef<K> {
k: *const K,
}
impl<K: Hash> Hash for LruKeyRef<K> {
fn hash<H: Hasher>(&self, state: &mut H) {
unsafe { (*self.k).hash(state) }
}
}
impl<K: PartialEq> PartialEq for LruKeyRef<K> {
fn eq(&self, other: &LruKeyRef<K>) -> bool {
unsafe { (*self.k).eq(&*other.k) }
}
}
这是我不明白的最后一行 unsafe
。我使用 HashMap
作为底层结构,键与值一起存储,我希望哈希器能够找到它。我使工作哈希键成为对真实键的引用,并提供 Hash
和 PartialEq
函数,以便 HashMap
可以找到并使用该键分桶的目的。这很容易。
然后我明白我必须为 PartialEq
比较两者,所以我必须使用 *self.k
取消引用当前对象,那么为什么 &*other.k
用于 other 对象?这就是我不明白的。为什么不只是 *other.k
?我不是只是取消引用两者以便比较实际的键吗?
最佳答案
我们希望调用PartialEq::eq
:
trait PartialEq<Rhs = Self>
where
Rhs: ?Sized,
{
fn eq(&self, other: &Rhs) -> bool;
}
假设默认实现 Rhs
= Self
和 Self
= K
,我们需要以两种&K
类型
other.k
是*const K
类型
*other.k
是K
类型
&*other.k
是类型&K
希望这么多应该有意义。
self.k
是类型*const K
*self.k
是K
类型
缺少的部分 method calls are allowed to automatically reference the value他们被召唤。这就是为什么引用和值没有明显的语法,就像在 C 或 C++ 中一样(foo.bar()
vs foo->bar()
) .
这样,K
被自动引用得到&K
,完成签名。
关于rust - 使用 Rust 解引用运算符 &* vs * with Self?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43218554/