rust - 使用 Rust 解引用运算符 &* vs * with Self?

标签 rust

我想写一个有内存大小限制的 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 作为底层结构,键与值一起存储,我希望哈希器能够找到它。我使工作哈希键成为对真实键的引用,并提供 HashPartialEq 函数,以便 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 = SelfSelf = K,我们需要以两种&K类型

  1. other.k*const K
  2. 类型
  3. *other.kK
  4. 类型
  5. &*other.k 是类型 &K

希望这么多应该有意义。

  1. self.k 是类型 *const K
  2. *self.kK
  3. 类型

缺少的部分 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/

相关文章:

rust - 特性 `std::ops::Add<std::time::Duration>` 没有为 `chrono::DateTime<chrono::Utc>` 实现

rust - 如何使用Default初始化具有通用const长度的数组?

audio - 用于 lv2 插件的带有 C 字符串的静态结构

string - 如何在 Rust 中惯用且高效地解析由字母和数字组成的字符串?

rust - 我可以阻止 cargo 在每个新项目中重建库吗?

rust - 如何在实现特征时对类型施加特征约束?

unit-testing - serde 实现中的模拟实例

data-structures - 为什么 VecDeque 比 Vec 慢?

arrays - 访问嵌套数组中的值

rust - 如何取得任何 :downcast_ref from trait object? 的所有权