作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下定义:
enum Either<T, U> {
Left(T),
Right(U),
}
对于这种类型,我如何获得等价于 #[derive(PartialEq)]
的东西?我想使用 match
表达式,例如:
impl<T: PartialEq, U: PartialEq> PartialEq for Either<T, U> {
fn eq(&self, other: &Either<T, U>) -> bool {
use Either::*;
match (*self, *other) {
(Left(ref a), Left(ref b)) => a == b,
(Right(ref a), Right(ref b)) => a == b,
_ => false,
}
}
}
这消耗了 *self
和 *other
,即使我只需要它用于 match
表达式,导致错误:
error[E0507]: cannot move out of borrowed content
--> src/lib.rs:9:16
|
9 | match (*self, *other) {
| ^^^^^ cannot move out of borrowed content
error[E0507]: cannot move out of borrowed content
--> src/lib.rs:9:23
|
9 | match (*self, *other) {
| ^^^^^^ cannot move out of borrowed content
最佳答案
通常,您只需使用#[derive(PartialEq)]
,如下所示:
#[derive(PartialEq)]
enum Either<T, U> {
Left(T),
Right(U),
}
这将为您生成实现特征的代码。 The Rust Programming Language describes the implementation details .
有时,您想直接实现特征。这可能是因为默认版本过于具体或过于笼统。
你的错误是你需要模式匹配引用而不是试图取消引用它们:
impl<T: PartialEq, U: PartialEq> PartialEq for Either<T, U> {
fn eq(&self, other: &Self) -> bool {
use Either::*;
match (self, other) {
(&Left(ref a), &Left(ref b)) => a == b,
(&Right(ref a), &Right(ref b)) => a == b,
_ => false,
}
}
}
当您创建一个元组时,您会将取消引用的项目移动到元组中,从而放弃所有权。当您拥有一个匹配 *foo
时,您不必放弃所有权。
在现代 Rust 中,您可以用更少的噪音编写相同的东西,因为在模式匹配时会发生更多的隐式引用/解引用:
impl<T: PartialEq, U: PartialEq> PartialEq for Either<T, U> {
fn eq(&self, other: &Self) -> bool {
use Either::*;
match (self, other) {
(Left(a), Left(b)) => a == b,
(Right(a), Right(b)) => a == b,
_ => false,
}
}
}
关于rust - 如何为枚举实现 PartialEq?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36297412/
我是一名优秀的程序员,十分优秀!