#attributes #higher-order #apply

nightly apply_attr

提供高级属性给 Rust 的语法扩展

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 模式

MPL-2.0 许可证

22KB
382

apply_attr

Build Status Downloads Version License

摘要

提供高级属性给 Rust 的语法扩展。

动机

有时可能希望将某些属性应用于作用域内的所有项(例如 modtraitimpl)。apply_attr 包旨在为此提供灵活的 API。

可能的用例包括

  • 让 mod xyz 中的所有结构体都使用 #[derive(PartialEq)]
  • 将某个 impl 中的所有方法标记为 #[inline(never)](例如,用于分析)。

入门

apply_attr 的最新版本添加到您项目的 Cargo.toml 依赖项中。

然后添加 …

#![feature(custom_attribute)]

#![feature(plugin)]
#![plugin(apply_attr)]

… 到您的包根文件(例如 lib.rsmain.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 的单一高级属性,它期望两个参数

  1. to(...)(其中 ... 是零个或多个选择器的列表)。
  2. 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进行版本控制。有关可用的版本,请参阅此存储库上的标签

作者

还可以查看参与此项目的贡献者列表

许可证

本项目采用MPL-2.0许可 – 请参阅LICENSE.md文件以获取详细信息。

依赖关系

~735KB
~16K SLoC