在macro_rules中!你可以在冒号后说出要解析的不同类型的东西(例如$ x:ident表示标识符,或$ y:ty表示类型),但是我对如何声明我想要捕获生命周期感到困惑,喜欢' a或'静态。这可能吗?
答案 0 :(得分:2)
您可以使用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> );
答案 1 :(得分:0)
您可以将它们捕获为$ exprs。
答案 2 :(得分:0)
如果您要根据给宏的参数创建新的通用生命周期参数,则必须将其与$my_lifetime:tt
(see playground)匹配:
macro_rules! my_macro {
($a:tt) => { struct MacroDefined<$a> { field: &$a str } }
}