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://opensource.org/licenses/MIT)
贡献
欢迎所有贡献和评论!如果您发现错误或想改进此包,请随时提交问题或PR。
依赖关系
~0.6–1MB
~24K SLoC