Rust 是否可以仅使用“宏规则!”来实现此宏?
我正在尝试制作一个宏,它可以让我遍历一个类型列表,以简化trait impl样板。(我目前使用的是另一种基于宏的解决方案,但如果不添加依赖项,这似乎更具可读性。) 这是我的目标语法: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 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
}
}