msgstr "нет правил, ожидающих токен` <`" при передаче типа в качестве идентификатора macro_rules - PullRequest
0 голосов
/ 30 апреля 2018

Пример игрушки:

macro_rules! boo {
    ($T:ident) => {
        let x: $T;
    };
}

fn main() {
    boo!(i32);         // WORKS
    boo!(Option<i32>); // PROBLEM
}

boo!(Option<i32>); вызывает ошибку:

error: no rules expected the token `<`
 --> src/main.rs:9:16
  |
9 |     boo!(Option<i32>);
  |                ^

Я могу обойти это:

type Opti32 = Option<i32>;
boo!(Opti32);

Но слишком скучно добавлять псевдоним для каждого использования макросов. Можно ли использовать макросы типа boo!(Option<i32>); и скрывать сложность внутри macro_rules?

1 Ответ

0 голосов
/ 30 апреля 2018

$T:ident может соответствовать только ident ifier.

Если вы хотите, чтобы $T соответствовал любому типу , даже если это не один идентификатор, вы должны использовать $T:ty вместо:

macro_rules! boo {
    ($T:ty) => {
        let x: $T;
    }
}

ident и ty называются «спецификаторами фрагментов», поскольку они указывают, какому фрагменту кода метавария $T может соответствовать. Первое издание книги Rust содержит главу о макросах , включающую список возможных спецификаторов фрагментов; Вы обязательно должны ознакомиться с содержанием этой главы, прежде чем пытаться написать макрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...