Rust 宏生成代码中未使用的变量

Rust 宏生成代码中未使用的变量,rust,rust-macros,Rust,Rust Macros,我编写了一个宏,它实现了类似Scala的功能,以便在Rust中进行理解。它将改变这一点: map_for!{ x <- 0..4; y = 2*x; z <- 0..1; => y+z } 这是可行的,但编译器会发出“未使用变量”警告,因为x未在平面映射中使用。我可以通过在宏中的let语句之前添加#[allow(unused_variables)]来禁用警告,但随后它会删除所有未使用的变量警告,因此: map_for!{ x <-

我编写了一个宏,它实现了类似Scala的功能,以便在Rust中进行理解。它将改变这一点:

map_for!{
    x <- 0..4;
    y = 2*x;
    z <- 0..1;
    => y+z
}
这是可行的,但编译器会发出“未使用变量”警告,因为
x
未在
平面映射中使用。我可以通过在宏中的
let
语句之前添加
#[allow(unused_variables)]
来禁用警告,但随后它会删除所有未使用的变量警告,因此:

map_for!{
    x <- 0..4;
    y = 2;
    z <- 0..1;
    => y+z
}
即使未使用
x
,也不会生成警告

有没有办法使第一个示例不会生成警告,但第二个示例会生成警告


可以使用,

我能想到的最简单的方法是通过使用一些惰性操作来确保使用
x
。例如,您可以使用
drop(&x)
或者可能
{let}
。这两种方法都不应该对周围的代码产生任何影响,因为它们都创建了借用,然后立即放弃借用。

或者即使是非常不透明但简洁的
{&x}
也不会隐藏第二个示例中不使用
x
?如果我正确理解OP,他们希望在那里生成一个警告。@Shepmaster:要么变量将“始终使用”,要么可以在扩展中添加惰性用法,要么不是。如果作者不知道哪个是哪个,那么就没有人知道,也没有解决方案。@DK作为宏作者,我不知道宏用户在没有完整的rust解析器的情况下是否使用该变量。但是从宏用户的角度来看,第一个示例中使用了
x
,而第二个示例中没有。@Jmb:,那么这听起来不可行。有人必须知道,从编译器的角度来看,一个真正没有被使用的变量是否应该被视为“已使用”。如果不是你,也不是最终用户,那么就没有人了。
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 })
    })