enums - 比较两个枚举的变体及其值时如何避免代码重复?
问题描述
我需要比较两个serde_json::Value
s:
enum Value {
Null,
Bool(bool),
Number(Number),
String(String),
Array(Vec<Value>),
Object(Map<String, Value>),
}
比较将返回另一个枚举:
enum Diff {
Equal,
Different,
NotFound,
}
我开始编写结构如下的代码:
fn compare(val1: &Value, val2: &Value) {
let cmp = match val1 {
Value::Null => {
if let Value::Null = val2 {
Diff::Equal
} else {
Diff::NotFound
}
}
Value::Bool(b1) => {
if let Value::Bool(b2) = val2 {
if b1 == b2 {
Diff::Equal
} else {
Diff::Different
}
} else {
Diff::NotFound
}
}
Value::Number(ref n1) => {
if let Value::Number(ref n2) = val2 {
if n1 == n2 {
Diff::Equal
} else {
Diff::Different
}
} else {
Diff::NotFound
}
}
Value::String(ref s1) => {
if let Value::String(ref s2) = val2 {
if s1 == s2 {
Diff::Equal
} else {
Diff::Different
}
} else {
Diff::NotFound
}
}
_ => {
// etc...
Diff::NotFound
}
};
}
我想避免很多代码重复。
- 一般来说,有没有更好的方法来比较枚举?
- 我怎样才能避免这种类型的重复(例如在 C++ 中你可以使用宏)
解决方案
您可以同时匹配 2 个值:
let cmp = match (val1, val2) {
(Value::Null, Value::Null) => Diff::Equal,
_ => {
// etc...
Diff::NotFound
}
};
您还可以实现转换函数或特征并使用它:
impl Diff {
fn new<T: PartialEq>(lhs: T, rhs: T) -> Diff {
if lhs == rhs { Diff::Equal } else { Diff::Different }
}
}
fn compare(val1: &Value, val2: &Value) {
let cmp = match (val1, val2) {
(Value::Null, Value::Null) => Diff::Equal,
(Value::Bool(b1), Value::Bool(b2)) => Diff::new(b1, b2),
_ => Diff::NotFound,
};
}
推荐阅读
- r - 关键词层次聚类与 R
- javascript - 使用繁琐的托管服务标识 (MSI) 将 javascript Azure 函数应用程序与 SQL 服务器连接起来
- selenium - selenium-jmete 一次性对 500 个用户的 Web 应用程序进行负载测试
- react-native - React-native 错误:Invariant Violation“main”尚未在 iOS 模拟器上注册
- java - 我可以在拖动按钮时将自定义可绘制对象设置为拖动阴影吗?
- c# - 是否在堆栈上分配了值类型的本地数组并立即收集垃圾?
- python - Python 剪辑和标志
- python - 尝试调用 API 并在收到的文件链接上使用解码以将其传输到另一个文件夹时获取错误类型
- flutter - 我们如何在颤振中发布动态列表
- android - 在活动中的 AppBarLayout 下方的片段中具有可折叠“标题”的 Recyclerview