typestar

Macros con repetición en Rust

La repetición captura una lista, así que una macro arma una colección entera.

use std::collections::HashMap;

macro_rules! table {
    ($($key:expr => $value:expr),* $(,)?) => {{
        let mut map = HashMap::new();
        $(map.insert($key, $value);)*
        map
    }};
}

macro_rules! log_all {
    ($($line:expr);*) => {
        $(println!("[log] {}", $line);)*
    };
}

fn main() {
    let tours = table! {
        "rust" => 11,
        "python" => 6,
    };
    println!("{}", tours["rust"]);

    log_all!("started"; "finished");
}

Cómo funciona

  1. $( ... ),* coincide con una lista separada por comas.
  2. El cuerpo se repite una vez por elemento capturado.
  3. Así funcionan las macros al estilo de vec! y hashmap!.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
25
Caracteres a escribir
384
Tokens
142
Ritmo de tres estrellas
110 tpm

Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 77 segundos.

Escribe este fragmento

Paso 3 de 3 en Macros; paso 9 de 12 en Módulos, pruebas y macros.

← Anterior Siguiente →