【发布时间】:2014-10-27 18:51:59
【问题描述】:
在宏规则中!您可以在冒号后声明要解析的不同类型的事物(例如 $x:ident 用于标识符,或 $y:ty 用于类型),但是我对如何声明我想要捕获一生感到困惑,像'a或'静态。现在可以吗?
【问题讨论】:
在宏规则中!您可以在冒号后声明要解析的不同类型的事物(例如 $x:ident 用于标识符,或 $y:ty 用于类型),但是我对如何声明我想要捕获一生感到困惑,像'a或'静态。现在可以吗?
【问题讨论】:
您可以使用 lifetime 说明符在宏中捕获生命周期:
macro_rules! match_lifetimes {
( $( lt:lifetime ),+ ) => {}
}
match_lifetimes!( 'a, 'b, 'static, 'hello );
您可以在RFC 或rust reference 中阅读有关lifetime 说明符的更多信息。
如果您只想匹配某个类型的泛型,最好改用tt:
struct Example<'a, T>(&'a T);
macro_rules! match_generics {
( $typ:ident < $( $gen:tt ),+ > ) => {}
}
match_generics!( Example<'a, T> );
【讨论】:
您可以将它们捕获为 $exprs。
【讨论】:
expr 似乎不起作用,即使在你提到的情况下:play.rust-lang.org/…
如果你想从给你宏的参数创建一个新的通用生命周期参数,那么你必须将它与$my_lifetime:tt (see playground) 匹配:
macro_rules! my_macro {
($a:tt) => { struct MacroDefined<$a> { field: &$a str } }
}
【讨论】: