【问题标题】:How to assert type in a Rust macro?如何在 Rust 宏中断言类型?
【发布时间】:2023-01-07 05:27:23
【问题描述】:

我创建了一个宏函数my_macro

macro_rules! my_macro {
    ($param1:expr, $param2:expr) => {
        // ...
    };
}

怎么可能断言$param1 是类型MyType?是否可以检查更复杂的东西,比如Box<T>?甚至返回类型?

我找到了assert_type_eq,但是关于它的文档很混乱,而且我不知道如何使用它。或者它是否是完成任务的最佳方法。

我想将这些类型断言添加到我的宏中,以便更容易发现它是否被错误使用。

【问题讨论】:

  • 如果$param1 应该是MyType,为什么首先要将它作为参数?只需在宏中直接使用MyType
  • 宏扩展发生在任何类型之前,因此您最好的希望是让您的宏生成一些稍后检查类型的代码。 let p1: MyType = $param1; 之类的东西可以,assert_type_eq 也可以。
  • 我相信 @kaya3 用 let 指出的是惯用的,从我在野外看到的。

标签: rust


【解决方案1】:

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

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 表达式只被评估一次。

【讨论】:

    猜你喜欢
    • 2019-12-05
    • 1970-01-01
    • 2016-03-16
    • 2012-09-23
    • 2022-07-23
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多