Почему я не могу получить доступ к переменной, объявленной в макросе, если я не передам имя переменной?
У меня есть этот макрос:
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 - это не просто замена прославленного текста).
Смотрите также: