#rust #scope #macros #hygiene
#Ржавчина #область видимости #макросы #гигиена
Вопрос:
Как quote
(декларативные) и proc_quote
(процедурные) макросы позволяют интерполировать локальные переменные?
Поскольку (декларативные) макросы гигиеничны, я бы ожидал, что они не смогут получить доступ к среде, в которой они вызываются.
Ответ №1:
Поскольку (декларативные) макросы гигиеничны, я бы ожидал, что они не смогут получить доступ к среде, в которой они вызываются.
Хотя почему?
vec![a, b, c]
работает нормально.
Гигиеничность макросов не означает, что они не могут получить доступ к среде, в которой они вызываются (это сделало бы их совершенно бесполезными), это означает, что они случайно не влияют на среду, в которой они вызываются, то есть внутренние символы макроса не будут ни просачиваться, ни конфликтовать с символами среды.
Например, при использовании макросов C имена внутри и за пределами макроса находятся в одном и том же пространстве имен, поэтому возможны коллизии и странные побочные эффекты.
Комментарии:
1.Я думаю, что ОП может быть сбит с толку тем, что макрос like
format!
нуждается в том, чтобы первый параметр был постоянным литералом. Этот вопрос был бы лучше, если бы он объяснял, почему они разные.2. Я не понял, что макрос расширяется до старой среды, то есть «как он обращается к ней» 🙂 Он просто вообще не обращается к нему; интерполяция просто отмечает, что что-то должно обрабатываться как переменная, не заключаемая в кавычки, а, например, перемещаемая в метод.
3. @mcarton Из того, что я получил из источника библиотеки,
format!
и друзья, в конечном счете, являются внутренними для компилятора, что, следовательно, требует, чтобы строка была известна во время компиляции.