我试图写一个像这样的宏:
macro_rules! impl_numeric_cast_methods {
($($ty:ty)*) => {
$(
fn from_$ty(v: $ty) -> Self {
v as Self
}
)*
}
}
由于宏观卫生,from_$ty
位不起作用。我发现如果$ty
是ident
,那么我可以(在不稳定时)使用concat_idents!
,但apparently doesn't work either除外。
有a blog post about this issue以及未来的计划来修复它,但我的问题是:我今天怎么能这样做?Rust stable(1.15)?有解决方法吗?
答案 0 :(得分:2)
作为一种合理的解决方法,您可以将函数名称添加为额外参数。它不优雅,但它有效:
macro_rules! impl_numeric_cast_methods {
($($ty:ty, $from_ty:ident),*) => {
$(
fn $from_ty(v: $ty) -> Self {
v as Self
}
)*
}
}
然后打电话给:
impl_numeric_cast_methods(i8, from_i8, u8, from_u8);
第二个宏可以使调用更短,但在我的情况下,这会使事情过于复杂。