6 个版本
使用旧的 Rust 2015
0.2.4 | 2017年12月3日 |
---|---|
0.2.3 | 2017年2月6日 |
0.2.2 | 2016年8月27日 |
0.2.1 | 2016年5月26日 |
0.1.0 | 2016年5月17日 |
2025 in Rust 模式
22KB
382 行
apply_attr
摘要
提供高级属性给 Rust 的语法扩展。
动机
有时可能希望将某些属性应用于作用域内的所有项(例如 mod
、trait
或 impl
)。apply_attr
包旨在为此提供灵活的 API。
可能的用例包括
- 让 mod
xyz
中的所有结构体都使用#[derive(PartialEq)]
。 - 将某个
impl
中的所有方法标记为#[inline(never)]
(例如,用于分析)。 - …
入门
将 apply_attr
的最新版本添加到您项目的 Cargo.toml
依赖项中。
然后添加 …
#![feature(custom_attribute)]
#![feature(plugin)]
#![plugin(apply_attr)]
… 到您的包根文件(例如 lib.rs
、main.rs
)。
完成这些后,您就可以开始使用了!
示例
#![feature(custom_attribute)]
#![feature(plugin)]
#![plugin(apply_attr)]
// Make all top-level structs as well as those
// within top-level mods implement `PartialEq`:
#![apply_attr(to(structs, mods(structs)), as_default(derive(PartialEq)))]
pub struct Foo;
mod Bar {
pub struct Baz;
// ...
}
// Disable inlining when `no_inline` feature is present:
#[cfg_attr(feature = "no_inline", apply_attr(to(fns), as_override(inline(never))))]
impl Blee {
fn foo(&self) { ... }
fn bar(&self) { ... }
fn baz(&self) { ... }
fn blee(&self) { ... }
}
fn main() {
Foo == Foo;
Bar::Baz == Bar::Baz;
}
API 参考
apply_attr
语法扩展提供了一个名为 apply_attr
的单一高级属性,它期望两个参数
to(...)
(其中...
是零个或多个选择器的列表)。as_default(...)
或as_override(...)
(其中...
是零个或多个属性的列表)。
结果可以是以下之一
#[apply_attr(to(...), as_default(...))]
#[apply_attr(to(...), as_override(...))]
第一个参数(to(...)
)接受一个嵌套的项选择器列表。
选择器
选择器的行为类似于CSS选择器
因此,一个CSS选择器如div > span, p
将转换为to(div(span), p)
。
扁平选择器
以下选择器是支持的
consts
crates
def_impls
enums
fgn_mods
fns
impls
macros
mods
statics
structs
traits
types
uses
嵌套选择器
以下这些允许嵌套
mods(...)
impls(...)
traits(...)
嵌套选择器表示直接祖先,相当于CSS的outer > inner
路径操作符。
属性
默认
属性可以应用为as_default(...)
,在这种情况下……
#[apply_attr(to(fns), as_default(inline(never)))]
impl Foo {
#[inline(always)]
fn foo() { ... }
}
……将在完成时转换为……
impl Foo {
#[inline(always)]
fn foo() { ... }
}
……
覆盖
或者使用as_override(...)
,在这种情况下……
#[apply_attr(to(fns), as_override(inline(never)))]
impl Foo {
#[inline(always)]
fn foo() { ... }
}
……将在完成时转换为……
impl Foo {
#[inline(never)]
fn foo() { ... }
}
……
调试
要查看属性是如何应用的,请使用此方法编译您的crate(需要nightly
)
cargo rustc -- -Z unstable-options --pretty=expanded
贡献
请阅读CONTRIBUTING.md以获取有关我们行为准则的详细信息以及向我们提交拉取请求的过程。
版本控制
我们使用SemVer进行版本控制。有关可用的版本,请参阅此存储库上的标签。
作者
- Vincent Esche – 初始工作 – Regexident
还可以查看参与此项目的贡献者列表。
许可证
本项目采用MPL-2.0许可 – 请参阅LICENSE.md文件以获取详细信息。
依赖关系
~735KB
~16K SLoC