$T:ident
может соответствовать только ident
ifier.
Если вы хотите, чтобы $T
соответствовал любому типу , даже если это не один идентификатор, вы должны использовать $T:ty
вместо:
macro_rules! boo {
($T:ty) => {
let x: $T;
}
}
ident
и ty
называются «спецификаторами фрагментов», поскольку они указывают, какому фрагменту кода метавария $T
может соответствовать. Первое издание книги Rust содержит главу о макросах , включающую список возможных спецификаторов фрагментов; Вы обязательно должны ознакомиться с содержанием этой главы, прежде чем пытаться написать макрос.