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
135,756 每月下载量
用于 485 个软件包 (34 直接)
15KB
270 行
custom_derive!
注意:本软件包已被 macro-attr
取代。
本软件包提供了一个宏,该宏允许使用自定义 derive
属性。
链接
许可证
根据您的选择,许可协议为以下之一
- MIT 许可证(见 LICENSE 或 http://opensource.org/licenses/MIT)
- Apache 许可证2.0版(见 LICENSE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
。
贡献
除非您明确表示,否则您提交给作品包含的任何贡献都将根据上述协议双许可,无需任何额外的条款或条件。
lib.rs
:
注意:本软件包已被 macro-attr
取代。
本软件包提供了一个宏,该宏允许使用自定义 derive
属性。
要使用它,请确保以如下方式链接到软件包
#[macro_use] extern crate 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>注意:`custom_derive!` 宏本身没有文档,因为对其的自动文档会非常大且难以理解。
用法
应使用此宏包装整个 单个 enum
或 struct
声明,包括其属性(包括 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
仅仅是一个技巧,用于将多个不同的函数打包到单个宏中。这个序列没有特殊含义;它只是与常规调用语法不同。