编译期确定某个类型是不是Option
2022-02-17

如何在编译期确定某个类型是不是 Option

要求不管是 Option<T> 还是 std::option::Option<T>, 抑或是 type A = Option<usize> 都能检测.

有个使用过程宏检测的简单办法, 原理是利用类型为 Option<T> 的变量一定可以被赋值为 None, 否则编译器会报错.

过程宏实现

#[proc_macro]
pub fn assert_option(item: TokenStream) -> TokenStream {
    let ty = parse_macro_input!(item as TypePath);
    let expand = quote! {
        {
            let _: #ty = ::std::option::Option::None;
        }
    };
    TokenStream::from(expanded)
}

使用

type M = Option<u8>;
// 编译成功
assert_option!(M);
// 编译失败
assert_option!(u8);