15个版本
使用旧Rust 2015
0.1.14+已弃用 | 2022年12月19日 |
---|---|
0.1.13+已弃用 | 2021年5月23日 |
0.1.12 | 2020年7月26日 |
0.1.9 | 2018年10月5日 |
0.1.5 | 2018年7月15日 |
#6 in #invocation
11,628 每月下载量
在 29 个crate中使用 (5 个直接使用)
15KB
60 行
Mashup: 一个稳定有效的concat_idents
注意: 如果您目标是Rust 1.31+,请使用具有更简单界面的 paste crate,除非您关心支持1.15和1.31之间的编译器。只有在您关心这一点的情况下才考虑使用此版本。 |
Rust标准库中的夜间仅用concat_idents!
宏在连接标识符方面非常薄弱,其连接的标识符只能引用现有项,永远不能用来定义新内容。
此crate提供了一种更灵活的连接标识符的方法。
[dependencies]
mashup = "0.1"
Mashup与任何1.15+版本的Rust编译器兼容。
那么,请告诉我关于连接标识符的内容
此crate提供了一个生成宏的宏mashup!
。您为mashup提供一个任意键标记到要连接的标识符的映射,mashup为您定义一个替换宏,该宏将您的键标记替换为与每个键标记对应的单个连接标识符。
#[macro_use]
extern crate mashup;
// Use mashup to generate a substitution macro called m. The substitution macro
// will replace all occurrences of the key token "method" in its input with the
// single concatenated identifier abc.
mashup! {
m["method"] = a b c;
}
struct Struct;
m! {
impl Struct {
fn "method"() {}
}
}
fn main() {
// Our struct now has an abc method.
Struct::abc();
}
术语表
-
替换宏:由
mashup!
宏产生的宏。提供给mashup!
的输入为要定义的一个或多个替换宏提供名称。上述简短示例中的替换宏称为m!
。 -
键标记:将在替换宏的输入中任何位置替换为单个连接标识符的任意标记。上述示例中使用的标记是
"method"
。 -
标识符片段:连接在一起形成最终宏展开代码中的单个连接标识符的标识符。以下代码中的
a
、b
、c
是标识符片段,它们组合起来形成abc
方法名。
更复杂的示例
此示例演示了一些更复杂的mashup用法。
-
您可能需要在您自己的更方便的用户界面宏内部捆绑一个
mashup!
调用。 -
调用
mashup!
可定义多个替换,包括通过 macro_rules 提供的重复功能,例如$(...)*
。 -
键标记可能由多个标记组成。
-
替换宏在项目位置和表达式位置中效果相同。
#[macro_use]
extern crate mashup;
const ROCKET_A: &str = "/a";
const ROCKET_B: &str = "/b";
macro_rules! routes {
($($route:ident),*) => {{
mashup! {
$(
m["rocket-codegen-route" $route] = ROCKET_ $route;
)*
}
m! {
vec![$("rocket-codegen-route" $route),*]
}
}}
}
fn main() {
let routes = routes!(A, B);
assert_eq!(routes, vec!["/a", "/b"]);
}
属性
替换宏的属性,包括文档注释,可以在 mashup 调用内部提供。
mashup! {
/// Needs better documentation.
#[macro_export]
m1["w"] = W w;
m1["x"] = X x;
#[macro_export]
#[doc(hidden)]
m2["y"] = Y y;
m2["z"] = Z z;
}
限制
-
mashup!
宏在词法作用域内最多只能调用一次。为了解决这个问题,您可以使用单个 mashup 调用定义多个替换宏,在单个调用中使用尽可能多的不同替换宏名称(#5)。 -
由于卫生性的原因,不能使用连接的标识符来引用捕获的局部变量(#6)。
许可证
根据您的选择,许可协议为 Apache 许可协议,版本 2.0 或 MIT 许可协议。除非您明确声明,否则根据 Apache-2.0 许可证的定义,您有意提交以包含在此软件包中的任何贡献,都应按上述方式双许可,没有任何附加条款或条件。
依赖关系
~225KB