Usar macro en archivos de módulos en React

Nilesh Katuwal 18 agosto 2022
  1. Macros de Rust
  2. Macros en cajas en Rust
  3. Macros dentro de la misma caja en Rust
Usar macro en archivos de módulos en React

En este artículo, aprenderemos sobre el uso de macros en archivos de módulos en Rust.

Macros de Rust

Rust proporciona un excelente soporte para macros. Por ejemplo, la metaprogramación, que se habilita a través de macros, implica escribir código que escribe otro código.

Las macros ofrecen una capacidad comparable a las funciones pero sin el costo de tiempo de ejecución asociado. Como las macros se extienden en tiempo de compilación, los costos de tiempo de compilación están asociados.

Las macros de Rust difieren significativamente de las macros de C. Por ejemplo, las macros de Rust se aplican al árbol de fichas, mientras que las macros de C sustituyen al texto.

Sintaxis:

*MacroRulesDefinition* :
  `macro_rules` `!` [IDENTIFIER] *MacroRulesDef*
MacroRules :
   MacroRule ( ; MacroRule )* ;?

MacroRule :
   MacroMatcher => MacroTranscriber

Macros en cajas en Rust

Una crate incluye una jerarquía de alcances de módulos. Cualquier objeto dentro de una caja tiene una ruta de módulo canónica que indica su ubicación dentro del árbol de módulos.

En el nivel superior de este árbol, hay un módulo anónimo. Un archivo fuente de Rust especifica un módulo cuyo nombre y ubicación en el árbol de módulos de la caja actual se definen externamente: ya sea por un elemento Módulo explícito en un archivo fuente al que se hace referencia.

También podría ser el nombre de las propias cajas. Cada archivo fuente es un módulo.

Sin embargo, no todos los módulos necesitan su archivo fuente: las definiciones de los módulos se pueden superponer en un solo archivo fuente.

Caja util:

#[macro_export]
macro_rules! foo {
    () => ()
}

Caja usuario:

use util::foo;

foo!();

Tenga en cuenta que las macros siempre residen en el nivel superior de un crate cuando se utiliza esta estrategia. Incluso si foo está contenido dentro de un mod bar, el crate user debe escribir use util::foo; y no use util::bar::foo;.

Puede exportar una macro desde un módulo de su caja utilizando pub use.

Macros dentro de la misma caja en Rust

foo::bar!();

mod foo {
    macro_rules! bar {
        () => ()
    }

    pub(crate) use bar;
}

foo::bar!();

La macro se puede importar y usar como cualquier otro objeto con uso pub. Y a diferencia de la forma anterior, esto no depende del orden del código fuente, por lo que puede usar la macro antes de que se haya escrito.

Cada macro tiene un nombre y una o más reglas. Cada regla consta de dos partes: un comparador, que describe la sintaxis con la que coincide, y un transcriptor, que describe la sintaxis que se sustituirá por una invocación coincidente con éxito.

Los delimitadores deben abarcar tanto al comparador como al transcriptor. Las expresiones, las declaraciones, los rasgos, los impls, los elementos extraños, los tipos y los patrones se pueden expandir a través de macros.