如何在稳定的Rust中使用宏值作为函数名的一部分?

时间:2017-02-05 12:41:47

标签: macros rust

我试图写一个像这样的宏:

macro_rules! impl_numeric_cast_methods {
    ($($ty:ty)*) => {
        $(
            fn from_$ty(v: $ty) -> Self {
                v as Self
            }
        )*
    }
}

由于宏观卫生,from_$ty位不起作用。我发现如果$tyident,那么我可以(在不稳定时)使用concat_idents!,但apparently doesn't work either除外。

a blog post about this issue以及未来的计划来修复它,但我的问题是:我今天怎么能这样做?Rust stable(1.15)?有解决方法吗?

1 个答案:

答案 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);

第二个宏可以使调用更短,但在我的情况下,这会使事情过于复杂。