Неиспользуемая переменная в сгенерированном макросе

Я написал макрос, который реализует подобный Scala для понимания в Rust. Это превратит это:

map_for!{
    x <- 0..4;
    y = 2*x;
    z <- 0..1;
    => y+z
}

в это:

((0..4).map (move |x| { let y = 2 * x; (x, y) }))
    .flat_map (move |params| {
        let (x, y) = params;
        (0..1).map (move |z| { y + z })
    })

Это работает, но компилятор выдает предупреждение "неиспользуемая переменная", потому что x не используется внутри flat_map, Я могу отключить предупреждение, добавив #[allow(unused_variables)] перед let операторы в макросе, но затем он удаляет все предупреждения о неиспользованных переменных, так это:

map_for!{
    x <- 0..4;
    y = 2;
    z <- 0..1;
    => y+z
}

будет расширяться в:

((0..4).map (move |x| { let y = 2; (x, y) }))
    .flat_map (move |params| {
        #[allow(unused_variables)]
        let (x, y) = params;
        (0..1).map (move |z| { y + z })
    })

и не будет выдавать предупреждение, даже если x действительно не используется.

Есть ли способ сделать так, чтобы первый пример не генерировал предупреждение, а второй?

Доступен полный код макроса с предупреждениями, а также полный код с подавленными предупреждениями.

1 ответ

Самый простой способ, который я могу придумать, - это обеспечить x используется, используя некоторую инертную операцию. Например, вы можете использовать drop(&x); или возможно {let _ = &x;}, Ни один из них не должен иметь никакого влияния на окружающий код, так как они оба создают, а затем немедленно отказываются от заимствования.

Другие вопросы по тегам