Ответ 1
Судя по ответам с https://github.com/rust-lang/rust/issues/38356#issuecomment-412920528, похоже, что этого сделать нельзя (по состоянию на 2018-08), а также не ссылаться на протокол Макро-ящик, ни ссылаться на любой другой ящик однозначно.
Я знаю, что такое переменная $crate
, но, насколько я могу судить, ее нельзя использовать внутри процедурных макросов. Есть ли другой способ добиться подобного эффекта?
У меня есть пример, который примерно требует, чтобы я написал что-то вроде этого, используя цитаты и ночные Rust
quote!(
struct Foo {
bar: [SomeTrait;#len]
}
)
Мне нужно убедиться, что SomeTrait
находится в области видимости (#len
ссылается на целое число вне области действия фрагмента).
Я использую процедурные макросы 2.0 по ночам, используя quote и syn, потому что proc-macro-hack
у меня не работает. Это пример, который я пытаюсь обобщить.
Судя по ответам с https://github.com/rust-lang/rust/issues/38356#issuecomment-412920528, похоже, что этого сделать нельзя (по состоянию на 2018-08), а также не ссылаться на протокол Макро-ящик, ни ссылаться на любой другой ящик однозначно.
В Edition 2015 (классический Rust) вы можете сделать это (но это хакерство):
::defining_crate::SomeTrait
в макросеdefining_crate
, выше работает нормально в пределах defining_crate
себя добавьте модуль в корень:
mod defining_crate { pub use super::*; }
В Выпуске 2018 требуются еще более хакерские решения (см. Эту проблему), хотя # 55275 может дать нам простой обходной путь.
Начиная с Rust 1.34, вы можете использовать extern my_crate as self
и использовать my_crate::Foo
вместо $crate::Foo
.
https://github.com/rust-lang/rust/issues/54647
https://github.com/rust-lang/rust/pull/57407
(Предоставлено: Neptunepink ## rust irc.freenode.net)