如何在编译期确定某个类型是不是 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);