Почему я не могу получить доступ к переменной, объявленной в макросе, если я не передам имя переменной? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть этот макрос:

macro_rules! set_vars {
    ( $($x:ident),* ) => {
        let outer = 42;
        $( let $x = outer; )*
    }
}                                                                             

, который расширяет этот вызов:

set_vars!(x, y, z);

в то, что я ожидаю (от --pretty=expanded):

let outer = 42;
let x = outer;
let y = outer;
let z = outer;

В следующем коде я могу напечатать x, y и z просто отлично, но outer кажется неопределенным:

error[E0425]: cannot find value `outer` in this scope
  --> src/main.rs:11:5
   |
11 |     outer;
   |     ^^^^^ not found in this scope

Я могу получить доступ к переменной outer, еслиЯ передаю его в качестве явного макропараметра.

Это намеренно, что-то связанное с "макро-гигиеной"?Если это так, то, вероятно, имеет смысл пометить такие «внутренние» переменные в --pretty=expanded каким-то особым образом?

1 Ответ

0 голосов
/ 11 декабря 2018

Да, это макро гигиена .Идентификаторы, объявленные в макросе, недоступны вне макроса (и наоборот).Макросы Rust не являются макросами C (то есть макросы Rust - это больше, чем прославленная замена текста).

См. Также:

...