10 个版本
| 0.1.5 | 2024年7月1日 |
|---|---|
| 0.1.3 | 2024年6月4日 |
| 0.1.1 | 2023年11月22日 |
| 0.0.5 | 2020年6月14日 |
| 0.0.3 | 2020年3月11日 |
2011 在 Rust 模式
每月下载量 962
50KB
1K SLoC
Synonym
概述
该 synonym 库是一个 Rust 包,旨在简化新类型的创建。它提供了一个可定制的 #[derive(Synonym)] 宏,它根据新类型的底层类型自动实现各种特质。这为您在定义新类型时节省了通常需要的样板代码。
使用方法
要使用 synonym,将其添加到您的 Cargo.toml 中
[dependencies]
synonym = "0.1.5"
基本示例
将 Synonym 特质导入到您的 Rust 文件中
use synonym::Synonym;
然后,定义您的 newtype 并用 #[derive(Synonym)] 注释它
#[derive(Synonym)]
pub struct MyInt(i32);
使用属性进行自定义
您可以使用 #[synonym(skip(...))] 和 #[synonym(force(...))] 属性来自定义实现的特质或跳过的特质
#[derive(Synonym)]
#[synonym(skip(Eq, PartialEq))]
pub struct MyString(String);
支持的 skip 和 force 值列在下面的 特质实现表 中。
生成的代码
当您使用#[derive(Synonym)]时,库会为各种特质生成实现。以下是一个针对新类型(i32)的简化示例。
impl Eq for MyInt {}
impl PartialEq for MyInt {
fn eq(&self, other: &Self) -> bool {
self.0 == other.0
}
}
// ... and so on for other traits
特质实现表
自定义方法
| 跳过/强制 | 整数 [1] |
非零* |
浮点数 |
字符串 |
Box<str> |
&'static str |
char |
|
|---|---|---|---|---|---|---|---|---|
| .as_str() | 字符串 | v | v | v | v | |||
| .value() [2] | 值 | v | v | v | v | v | v | v |
转换
| 跳过/强制 | 整数 [1] |
非零* |
浮点数 |
字符串 |
Box<str> |
&'static str |
char |
|
|---|---|---|---|---|---|---|---|---|
| AsRef | AsRef | v | v | v | v | v | v | v |
| Borrow | 字符串 | v | v | v | ||||
| From<&'a str> | 字符串 | v | v [4] | |||||
| From | 字符串 | v | ||||||
| Deref [3] | Deref | |||||||
| DerefMut [3] | DerefMut | |||||||
| From | From | v | v | v | v | v | v | v |
| FromStr | FromStr | v | v | v | v | v | v |
基本特质
| 跳过/强制 | 整数 [1] |
非零* |
浮点数 |
字符串 |
Box<str> |
&'static str |
char |
|
|---|---|---|---|---|---|---|---|---|
| Clone | Clone | v | v | v | v | v | v | v |
| Copy | Copy | v | v | v | v | v | ||
| Debug | Debug | v | v | v | v | v | v | v |
| Default | Default | v | v | v | v | v | v | |
| Display [5] | Display | v | v | v | v | v | v | v |
| Hash | Hash | v | v | v | v | v | v |
比较
| 跳过/强制 | 整数 [1] |
非零* |
浮点数 |
字符串 |
Box<str> |
&'static str |
char |
|
|---|---|---|---|---|---|---|---|---|
| PartialOrd | PartialOrd | v | v | v | v | v | v | v |
| Ord | Ord | v | v | v | v | v | v | |
| PartialEq | PartialEq | v | v | v | v | v | v | v |
| Eq | Eq | v | v | v | v | v | v |
Serde [6]
| 跳过/强制 | 整数 [1] |
非零* |
浮点数 |
字符串 |
Box<str> |
&'static str |
char |
|
|---|---|---|---|---|---|---|---|---|
| Serialize | Serialize | v | v | v | v | v | v | |
| Deserialize | Deserialize | v | v | v | v | v | v |
数学 [7]
| 跳过/强制 | 整数 [1] |
非零* |
浮点数 |
字符串 |
Box<str> |
&'static str |
char |
|
|---|---|---|---|---|---|---|---|---|
| Add=Self | 数字 | v | v | |||||
| AddAssign | 数字 | v | v | |||||
| Sub=Self | 数字 | v | v | |||||
| SubAssign | 数字 | v | v | |||||
| Mul=Self | 数字 | v | v | |||||
| MulAssign | 数字 | v | v | |||||
| Div=Self | 数字 | v | v | |||||
| DivAssign | 数字 | v | v |
[1] 整数包括:u8、u16、u32、u64、u128、usize、i8、i16、i32、i64、i128、isize [2] .value() 对于Copy类型返回&Inner,对于非Copy类型返回&Inner [3] Deref和DerefMut不会实现,除非使用#[synonym(force(deref,deref_mut))]强制 [4] 与其他字符串不同,FromStr对于Box<str>同义词使用Inner::From<&'str>而不是Inner::FromStr,因为不存在Box<str>的Inner::FromStr实现 [5] 显示实现可以配置,见下文 [6] 当启用功能with_serde时才提供 [7] 这可能发生变化
微调
Display
为了指定如何实现Display特性行为,您可以使用以下#[synonym(display = "...")]属性。以下是可用的选项:
Opaque:以TypeName(Value)格式输出。Transparent:直接使用内部类型的Display实现。UpperCase:在显示之前将内部值转换为大写。LowerCase:在显示之前将内部值转换为小写。OpaqueUpperCase:以TypeName(VALUE)格式输出,其中VALUE为大写。OpaqueLowerCase:以TypeName(value)格式输出,其中value为小写。Custom string:允许使用自定义格式字符串。
示例
#[derive(Synonym)]
#[synonym(display = "UpperCase")]
struct CountryName(String);
#[derive(Synonym)]
#[synonym(display = "::<> {} <>::")]
struct Turbo(String);
Serde支持
要启用序列化和反序列化的Serde支持,您需要在您的Cargo.toml中启用with_serde功能标志。
[dependencies]
synonym = { version = "0.1.5", features = ["with_serde"] }
启用此功能后,将自动为您类型实现Serialize和Deserialize特性行为。
本文档由OpenAI的ChatGPT-4协助生成。
许可证
在MIT许可证下授权(LICENSE-MIT 或 https://open-source.org.cn/licenses/MIT)
贡献
欢迎所有贡献和评论!如果您发现错误或想改进此包,请随时提交问题或PR。
依赖关系
~0.6–1MB
~24K SLoC