es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear la suma de unos hasta N utilizando una macro en Rust

Me gustaría crear una macro para transformar “count!(5)” en “1+1+1+1+1”. La razón final es usar “count!(N) – 1” en una definición de estructura donde “N” es un genérico constante.

macro_rules! count {
    (1) => {0};
    (2) => {1 + count!(1)};
    ($n: tt) => {1 + count!($n - 1)};
}

struct WindowIterator<i, item,="" const="" n:="" usize=""> {
    iter: I,
    values: Box<[Item; count!(N) - 1]>,
    index: usize,
}

Con esta definición, recibo un error que dice “no se esperaba el token N”.

¿Cómo puedo cambiar mi código para hacerlo correctamente?</i,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para usar las constantes genéricas N en la macro count!, necesitas cambiar la definición de la macro para que acepte un identificador en lugar de un literal. Aquí está la definición modificada de la macro:

    macro_rules! count {
        ($ident:ident) => { 0 };
        ($ident:ident - 1) => { count!($ident) + 1 };
        ($ident:ident) => { count!($ident - 1) + 1 };
    }
    

    Con esta modificación, puedes usar la macro count!(N) en la definición de la estructura WindowIterator:

    struct WindowIterator<i, item,="" const="" n:="" usize=""> {
        iter: I,
        values: Box<[Item; count!(N - 1)]>,
        index: usize,
    }
    

    Ahora, count!(N - 1) se expandirá al número correcto y ya no deberías recibir un error.</i,>

Comments are closed.