Rust 是否可以仅使用“宏规则!”来实现此宏?

Rust 是否可以仅使用“宏规则!”来实现此宏?,rust,rust-macros,Rust,Rust Macros,我正在尝试制作一个宏,它可以让我遍历一个类型列表,以简化trait impl样板。(我目前使用的是另一种基于宏的解决方案,但如果不添加依赖项,这似乎更具可读性。) 这是我的目标语法: trait MyTrait {} tfor! { for Ty in [i32, u32] { impl MyTrait for Ty {} } } 我的尝试: macro_rules! tfor { (for $ty:ident in [$($typ:ident),*]

我正在尝试制作一个宏,它可以让我遍历一个类型列表,以简化trait impl样板。(我目前使用的是另一种基于宏的解决方案,但如果不添加依赖项,这似乎更具可读性。)

这是我的目标语法:

trait MyTrait {}

tfor! {
    for Ty in [i32, u32] {
        impl MyTrait for Ty {}
    }
}
我的尝试:

macro_rules! tfor {
    (for $ty:ident in [$($typ:ident),*] $tt:tt) => {
        $(
            type $ty = $typ;
            tfor! { @extract $tt }
        )*
    };
    (@extract { $($tt:tt)* }) => {
        $($tt)*
    };
}
这会生成一个错误,因为两次迭代都在同一范围内定义了名为
Ty
的类型:

   |
4  |               type $ty = $typ;
   |               ^^^^^^^^^^^^^^^^
   |               |
   |               `Ty` redefined here
   |               previous definition of the type `Ty` here


有办法解决这个问题吗?我是否可以以某种方式生成一个随机标识符来代替
Ty
,以便在不使用proc宏或依赖项的情况下进行编译?

您可以在
const
声明中定义trait实现的范围。这样,您就可以重复使用
Ty
名称,而不会引起冲突

macro\u规则!tfor{
(对于[$($typ:ident),*]$tt:tt中的$ty:ident)=>{
$(
常数:()={
类型$ty=$typ;
tfor!{@extract$tt}
};
)*
};
(@extract{$($tt:tt)*})=>{
$($tt)*
};
}
性状MyTrait{}
tfor!{
对于[i32,u32]中的Ty{
Ty{}的impl MyTrait
}
}