gpt4 book ai didi

types - 为什么 Rust 期望双重借用 (`&&' a mut T`)

转载 作者:行者123 更新时间:2023-11-29 08:23:16 25 4
gpt4 key购买 nike

我的代码看起来像 this :

pub enum Cache<'a, T> {
Pending(&'a dyn FnOnce() -> T),
Cached(T),
}

impl<'a, T> Cache<'a, T> {
pub fn get(&self) -> &mut T {
// This caches and borrows the T
}
}

impl<'a, T> PartialEq for Cache<'a, T>
where &'a mut T: PartialEq {

fn eq(&self, other: &Self) -> bool {
self.get().eq(other.get())
}
}

但是实现 Eq 失败了:

error[E0308]: mismatched types
--> src/lib.rs:20:23
|
20 | self.get().eq(other.get())
| ^^^^^^^^^^^ expected mutable reference, found type parameter
|
= note: expected type `&&'a mut T`
found type `&mut T`

我想我在概念上误解了一些东西。

最佳答案

你可以理解为什么 Rust 期待一个 &&mut T通过查看 eq() 的定义PartialEq 中的方法特点:

fn eq(&self, other: &Rhs) -> bool;

这个方法的参数类型是&Self&Rhs ;自 Rhs默认为 Self并且您没有在特征界限中指定任何其他内容,两个参数都应为 &Self 类型.

现在 Self 是什么?在这种情况下?你的特质界限是这样的:

&'a mut T: PartialEq

所以只有PartialEq编译器可以使用的实现是 &'a mut T 类型的实现,所以这就是Self是; &Self ,反过来,必须是 &&'a mut T ,这正是编译器所期望的。

您可能想要 T 的特征绑定(bind)相反:

impl<'a, T> PartialEq for Cache<'a, T>
where
T: PartialEq,
{
fn eq(&self, other: &Self) -> bool {
self.get() == other.get()
}
}

另请注意,您可以简单地使用 ==而不是显式调用 eq() .它使正确的类型更容易一些,因为编译器将隐式引用参数 - a == b扩展为 PartialEq::eq(&a, &b) .

关于types - 为什么 Rust 期望双重借用 (`&&' a mut T`),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55406890/

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