2 个版本
0.1.1 | 2024 年 7 月 2 日 |
---|---|
0.1.0 | 2024 年 7 月 2 日 |
#725 在 数据结构
7KB
108 行
is-x
检查值的特定条件:是否为空?是否为默认值?
也参见:https://internals.rust-lang.org/t/traits-for-is-empty-and-or-is-default/21114
示例
对于 IsDefault
特质
use isx::prelude::*;
fn test () {
assert!(false.is_default());
assert!(true.is_not_default());
}
对于 IsEmpty
特质
use isx::prelude::*;
fn test () {
assert!(vec![].is_empty());
assert!(None::<()>.is_empty());
}
为什么?
因为在某些情况下,有一个通用模式会更好
#[derive(Default, IsDefault, IsEmpty, serde::Serialize, serde::Deserialize)]
struct MySubData {
// […]
}
#[derive(Default, serde::Serialize, serde::Deserialize)]
struct MyData {
#[serde(default, skip_serializing_if = "IsEmpty::is_empty")]
list: Vec<String>,
#[serde(default, skip_serializing_if = "IsEmpty::is_empty")]
map: HashMap<String, String>,
#[serde(default, skip_serializing_if = "IsEmpty::is_empty")]
optional: Option<String>,
#[serde(default, skip_serializing_if = "IsDefault::is_default")]
flag: bool,
#[serde(default, skip_serializing_if = "IsEmpty::is_empty")]
sub_data: MySubData,
}
如果它在 std
或 core
中,可能会说服人们采用这种做法
#[derive(Default, serde::Serialize, serde::Deserialize)]
struct MyData {
#[serde(default, skip_serializing_empty)]
list: Vec<String>,
#[serde(default, skip_serializing_empty)]
map: HashMap<String, String>,
#[serde(default, skip_serializing_default)]
flag: bool,
}
待办事项
- 为
IsDefault
实现 derive - 为
IsEmpty
实现 derive