【问题标题】:Capturing lifetimes in rust macro_rules在 rust macro_rules 中捕获生命周期
【发布时间】:2014-10-27 18:51:59
【问题描述】:

在宏规则中!您可以在冒号后声明要解析的不同类型的事物(例如 $x:ident 用于标识符,或 $y:ty 用于类型),但是我对如何声明我想要捕获一生感到困惑,像'a或'静态。现在可以吗?

【问题讨论】:

    标签: macros rust


    【解决方案1】:

    您可以使用 lifetime 说明符在宏中捕获生命周期:

    macro_rules! match_lifetimes {
        ( $( lt:lifetime ),+ ) => {}
    }
    
    match_lifetimes!( 'a, 'b, 'static, 'hello );
    

    playground

    您可以在RFCrust reference 中阅读有关lifetime 说明符的更多信息。


    如果您只想匹配某个类型的泛型,最好改用tt

    struct Example<'a, T>(&'a T);
    
    macro_rules! match_generics {
        ( $typ:ident < $( $gen:tt ),+ > ) => {}
    }
    
    match_generics!( Example<'a, T> );
    

    playground

    【讨论】:

      【解决方案2】:

      您可以将它们捕获为 $exprs。

      【讨论】:

      • 我已经尝试过这样做,但它似乎对我不起作用。这是一个游戏围栏:http://is.gd/dNaiiS。我做错了吗?
      • 它需要一个已经定义的生命周期才能工作。在这种情况下,为生命周期提供特定名称并没有真正的目的,因为它只是用作通用参数。如果已经定义了生命周期(例如,作为循环的标签),则 $expr 可以正常工作。不过,我可以想象,如果你有一个 trait 或 struct 在一生中参数化,它会很有用,而且我确实不确定是否有办法做到这一点(我从来不需要这样做)。
      • 这是一个复杂的例子,说明它的用处:is.gd/9Qj1H3。我想使用它,因为我有一个宏可以生成一个在整个生命周期 中通用的函数,因为它接受了一个由该生命周期参数化的参数。在我的例子中,函数体通常希望返回一个任意值,但有时它希望返回从参数中提取的值,该值只能在给定的生命周期内存活。
      • @JW : expr 似乎不起作用,即使在你提到的情况下:play.rust-lang.org/…
      【解决方案3】:

      如果你想从给你宏的参数创建一个新的通用生命周期参数,那么你必须将它与$my_lifetime:tt (see playground) 匹配:

      macro_rules! my_macro {
          ($a:tt) => { struct MacroDefined<$a> { field: &$a str } }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-07-03
        • 2017-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-24
        • 2014-09-10
        • 1970-01-01
        相关资源
        最近更新 更多