#newtype #synonyms #macro-derive #alias

synonym

自定义 derive 宏用于创建 newtype。它查看底层类型以选择应实现哪些特质。

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日

2011Rust 模式

Download history 489/week @ 2024-04-26 440/week @ 2024-05-03 370/week @ 2024-05-10 634/week @ 2024-05-17 482/week @ 2024-05-24 835/week @ 2024-05-31 598/week @ 2024-06-07 509/week @ 2024-06-14 884/week @ 2024-06-21 1207/week @ 2024-06-28 244/week @ 2024-07-05 135/week @ 2024-07-12 194/week @ 2024-07-19 328/week @ 2024-07-26 216/week @ 2024-08-02 189/week @ 2024-08-09

每月下载量 962

自定义许可

50KB
1K SLoC

Crates.io Docs.rs MIT License Build Status Maintenance

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);

支持的 skipforce 值列在下面的 特质实现表 中。

生成的代码

当您使用#[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] 整数包括:u8u16u32u64u128usizei8i16i32i64i128isize [2] .value() 对于Copy类型返回&Inner,对于非Copy类型返回&Inner [3] DerefDerefMut不会实现,除非使用#[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"] }

启用此功能后,将自动为您类型实现SerializeDeserialize特性行为。


本文档由OpenAI的ChatGPT-4协助生成。

许可证

在MIT许可证下授权(LICENSE-MIThttps://opensource.org/licenses/MIT

贡献

欢迎所有贡献和评论!如果您发现错误或想改进此包,请随时提交问题或PR。

依赖关系

~0.6–1MB
~24K SLoC