如何在Rust宏中断言类型?

3
我创建了一个宏函数my_macro:
macro_rules! my_macro {
    ($param1:expr, $param2:expr) => {
        // ...
    };
}

有什么方法可以断言 $param1 是类型 MyType 吗?是否可能检查更复杂的内容,如 Box<T> 或返回类型?
我发现了 assert_type_eq,但是文档很不清楚,我不知道该如何使用它,或者它是否是完成任务的最佳方法。
我想在我的宏中添加这些类型断言,以使其更容易发现错误用法。

3
如果 $param1 应该是 MyType,为什么要首先将其转换为参数呢?直接在宏中使用 MyType 即可。 - Jmb
6
宏展开发生在任何类型之前,因此您最好的选择就是让您的宏生成一些代码,稍后再检查类型。类似于 let p1: MyType = $param1; 就可以工作,assert_type_eq 也可以工作。 - kaya3
我相信@kaya3用let指出的是惯用法,从我在实践中看到的情况来看。 - Ivan C
1个回答

5

将其分配给显式类型的变量:

macro_rules! my_macro {
    ($param1:expr, $param2:expr) => {
        {
            let param1: u64 = $param1; // compiling will throw an error
                                       // if the result isn't a u64
            let param2: u64 = $param2;
            
            param1 + param2
        }
    };
}

这样做的好处是确保 $param1 表达式只被评估一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接