gpt4 book ai didi

rust - 如何为枚举实现PartialEq?

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

我有以下定义:

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表达式,这也会消耗 *othermatch,从而导致错误:

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,
}
}
}

创建元组时,您将把取消引用的项目移到元组中,从而放弃所有权。当您拥有 match *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/61895181/

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