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

Download history 2744/week @ 2024-03-14 2606/week @ 2024-03-21 2388/week @ 2024-03-28 2714/week @ 2024-04-04 2860/week @ 2024-04-11 2672/week @ 2024-04-18 2662/week @ 2024-04-25 2477/week @ 2024-05-02 2596/week @ 2024-05-09 2389/week @ 2024-05-16 2529/week @ 2024-05-23 2799/week @ 2024-05-30 2676/week @ 2024-06-06 2885/week @ 2024-06-13 2869/week @ 2024-06-20 2724/week @ 2024-06-27

11,628 每月下载量
29 个crate中使用 (5 个直接使用)

MIT/Apache

15KB
60

Mashup: 一个稳定有效的concat_idents

github crates.io docs.rs build status


注意: 如果您目标是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"

  • 标识符片段:连接在一起形成最终宏展开代码中的单个连接标识符的标识符。以下代码中的abc是标识符片段,它们组合起来形成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.0MIT 许可协议
除非您明确声明,否则根据 Apache-2.0 许可证的定义,您有意提交以包含在此软件包中的任何贡献,都应按上述方式双许可,没有任何附加条款或条件。

依赖关系

~225KB