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

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

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 ответ

Решение

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

Смотрите также:

Другие вопросы по тегам