作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的代码看起来像 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/
我是一名优秀的程序员,十分优秀!