gpt4 book ai didi

rust - 使用带有Self的Rust取消引用运算符&* vs *?

转载 作者:行者123 更新时间:2023-12-03 11:39:35 24 4
gpt4 key购买 nike

我想写一个具有内存大小限制而不是std中“对象数”限制的LRU缓存。在尝试自己解决这个问题之后,我作弊并看着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作为底层结构, key 与值一起存储,并且我希望哈希器能够找到它。我将工作哈希键作为对实际键的引用,并提供 HashPartialEq函数,以便 HashMap可以找到并使用该键进行存储。这很容易。

这样我就知道我必须将 PartialEq进行比较,因此对我来说有意义的是,我必须使用 *self.k取消引用当前对象,所以为什么要为另一个对象使用 &*other.k?那是我不明白的。为什么不只是 *other.k?我不只是同时引用这两个引用,以便可以比较实际的 key 吗?

最佳答案

我们希望调用PartialEq::eq:

trait PartialEq<Rhs = Self>
where
Rhs: ?Sized,
{
fn eq(&self, other: &Rhs) -> bool;
}

假设默认实现 Rhs = SelfSelf = 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()foo->bar())。

    因此, K被自动引用以获得 &K,从而实现签名。

    关于rust - 使用带有Self的Rust取消引用运算符&* vs *?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61594171/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com