我有一个具有以下结构的枚举:
enum Expression {
Add(Add),
Mul(Mul),
Var(Var),
Coeff(Coeff)
}
Run Code Online (Sandbox Code Playgroud)
每个变体的"成员"都是结构.
现在我想比较两个枚举是否有相同的变体.所以,如果我有
let a = Expression::Add({something});
let b = Expression::Add({somethingelse});
Run Code Online (Sandbox Code Playgroud)
cmpvariant(a, b)应该是true.我可以想象一个简单的双重match代码,它遍历两个枚举实例的所有选项.但是,如果它存在,我正在寻找一个更好的解决方案.如果没有,双重匹配会有开销吗?我想在内部我只是比较两个整数(理想情况下).
我有以下定义:
enum Either<T, U> {
Left(T),
Right(U),
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到#[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,
}
}
}
Run Code Online (Sandbox Code Playgroud)
这既消耗*self和*other,即使我只需要它的match表达,导致错误:
error[E0507]: cannot move out of borrowed content
--> src/lib.rs:9:16
|
9 | match (*self, *other) …Run Code Online (Sandbox Code Playgroud) rust ×2