我希望编写一个LRU缓存,其内存大小有限制,而不是std中的“对象数量”限制。在自己试图理解之后,我作弊看了现有实现,我几乎理解了它,但这阻止了我:
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对象要使用 &*other.k
?这就是我不明白的地方。为什么不只是 *other.k
?难道我不是对两个对象进行取消引用以便比较实际键吗?
&
在这里是因为PartialEq#eq
需要一个引用;*other.k
会移动键,而other.k
则会传递指针。对此还有什么不清楚的吗?一些附注:你在哪里找到了那个实现?那种使用指针的方式并不是你随处可见的。 - E net4*self.k
可以工作呢?我不明白这里的不对称之处。在C++中,它不会是不对称的。我从一个旧的libcore提案中找到了这个例子:https://github.com/thestinger/rust-core/blob/master/core/lru.rs - Elf Sternberg