#macro-derive #macro #derive #custom

no-std custom_derive

(注意:已被 macro-attr 取代) 本软件包提供了一个宏,该宏允许使用自定义 derive 属性

6 个版本

使用旧的 Rust 2015

0.1.7 2016年11月21日
0.1.5 2016年3月30日
0.1.4 2016年1月18日
0.1.2 2015年9月16日
0.1.1 2015年8月16日

#8 in #custom

Download history 32063/week @ 2024-03-14 31321/week @ 2024-03-21 25230/week @ 2024-03-28 23988/week @ 2024-04-04 24882/week @ 2024-04-11 25039/week @ 2024-04-18 25450/week @ 2024-04-25 26464/week @ 2024-05-02 29076/week @ 2024-05-09 36145/week @ 2024-05-16 37049/week @ 2024-05-23 46747/week @ 2024-05-30 40752/week @ 2024-06-06 34865/week @ 2024-06-13 27411/week @ 2024-06-20 21929/week @ 2024-06-27

135,756 每月下载量
用于 485 个软件包 (34 直接)

MIT/Apache

15KB
270

custom_derive!

注意:本软件包已被 macro-attr 取代。

本软件包提供了一个宏,该宏允许使用自定义 derive 属性。

链接

许可证

根据您的选择,许可协议为以下之一

贡献

除非您明确表示,否则您提交给作品包含的任何贡献都将根据上述协议双许可,无需任何额外的条款或条件。


lib.rs:

注意:本软件包已被 macro-attr 取代。

本软件包提供了一个宏,该宏允许使用自定义 derive 属性。

要使用它,请确保以如下方式链接到软件包

#[macro_use] extern crate custom_derive;

注意:`custom_derive!` 宏本身没有文档,因为对其的自动文档会非常大且难以理解。

<style type="text/css"> .link-block { font-family: "Fira Sans"; } .link-block > p { display: inline-block; } .link-block > p > strong { font-weight: 500; margin-right: 1em; } .link-block > ul { display: inline-block; padding: 0; list-style: none; } .link-block > ul > li { font-size: 0.8em; background-color: #eee; border: 1px solid #ccc; padding: 0.3em; display: inline-block; } </style>

用法

应使用此宏包装整个 单个 enumstruct 声明,包括其属性(包括 derive 和其他属性)。所有宏不认识的推导属性都将假定是自定义的,并相应处理。

`custom_derive!` 假设自定义推导作为宏实现(具有相同的名称)。例如,以下是一个简单的推导宏

#[macro_use] extern crate custom_derive;

trait TypeName {
fn type_name() -> &'static str;
}

trait ReprType {
type Repr;
}

macro_rules! TypeName {
(() $(pub)* enum $name:ident $($tail:tt)*) => { TypeName! { @impl $name } };
(() $(pub)* struct $name:ident $($tail:tt)*) => { TypeName! { @impl $name } };

(@impl $name:ident) => {
impl TypeName for $name {
fn type_name() -> &'static str { stringify!($name) }
}
};
}

macro_rules! TryFrom {
(($repr:ty) $(pub)* enum $name:ident $($tail:tt)*) => {
impl ReprType for $name {
type Repr = $repr;
}
};
}

custom_derive! {
#[allow(dead_code)]
#[repr(u8)]
#[derive(Clone, Copy, Debug, TryFrom(u8), TypeName)]
enum Foo { A, B }
}

fn main() {
let foo = Foo::B;
let v = foo as <Foo as ReprType>::Repr;
let msg = format!("{}: {:?} ({:?})", Foo::type_name(), foo, v);
assert_eq!(msg, "Foo: B (1)");
}

首先,请注意 `custom_derive!` 将任何传递给推导属性的参数传递给宏。在没有参数的属性的情况下,传递的是 ()

其次,宏函数接收整个项,但不包括属性。解析项是派生宏的职责。

第三,每个派生宏应该生成零个或多个项,不包括自身。因此,无法以任何方式修改项,也不能附加额外的属性。

最后,@impl仅仅是一个技巧,用于将多个不同的函数打包到单个宏中。这个序列没有特殊含义;它只是与常规调用语法不同。

无运行时依赖