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日 |
#9 in #invocation
11,638 每月下载
在 30 个crate中使用 (通过 mashup)
17KB
238 行
Mashup:一个稳定的工作concat_idents
注意: 如果您针对Rust 1.31+,请使用具有更简单界面的 paste crate。只有在您关心支持1.15和1.31之间的编译器时才考虑使用此版本。 |
Rust标准库中仅限nightly的 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!
调用可以定义多个替换,包括通过宏_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 License, Version 2.0 或 MIT license 下获得许可。除非您明确表示,否则,根据 Apache-2.0 许可证定义的,您有意提交给本软件包的任何贡献,都将根据上述许可双重许可,没有其他条款或条件。
依赖关系
~225KB