macros - libro - rust language
¿Usando $ crate en las macros de procedimiento de Rust? (2)
Basado en las respuestas de https://github.com/rust-lang/rust/issues/38356#issuecomment-412920528 , parece que no hay manera de hacer esto (a partir de 2018-08), ni referirse al proc -Macro de la caja ni para referirse a ninguna otra caja de forma inequívoca.
Sé cuál es la variable $crate
, pero por lo que puedo decir, no se puede utilizar dentro de macros de procedimiento. ¿Hay otra manera de lograr un efecto similar?
Tengo un ejemplo que casi me obliga a escribir algo como esto usando quote y Rust nocturno
quote!(
struct Foo {
bar: [SomeTrait;#len]
}
)
Necesito asegurarme de que SomeTrait
esté dentro del alcance ( #len
hace referencia a un entero que está fuera del alcance del fragmento).
Estoy usando macros de procedimiento 2.0 todas las noches usando cotización y sincronización porque proc-macro-hack
no me funcionó. Este es el ejemplo que estoy tratando de generalizar.
En la Edición 2015 (Rust clásico), puedes hacer esto (pero es intrépido):
- use
::defining_crate::SomeTrait
en la macro - dentro de cajas de terceros, dependiendo de
defining_crate
, lo anterior funciona bien dentro de
defining_crate
, agregue un módulo en la raíz:mod defining_crate { pub use super::*; }
En la Edición 2018 se requieren aún más soluciones de #55275 (consulte este problema ), aunque #55275 puede darnos una solución sencilla.