rust - 在编译时转换 proc_macro::Literal
问题描述
如何将 a 转换proc_macro::Literal
为内部值?例如我有
use proc_macro::{ TokenStream, TokenTree };
#[proc_macro]
pub fn xtest(items: TokenStream) -> TokenStream {
if let Some(TokenTree::Literal(l)) = items.into_iter().next() {
println!("{:?}", l);
// output: Literal { kind: Integer, symbol: "0x42", suffix: None, span: #0 bytes(52..56) }
// how can I convert 'l'?
// assert_eq!(l, 0x42);
}
TokenStream::new()
}
并像使用它一样
#[test]
fn test_fn() {
xtest!(0x42);
}
在xtest
宏中,我需要知道对其运行操作的值。
目前,对数字文字的支持就足够了(在“1”、“0x10”、“1_000”等变体中)。对左右的解释1 << 2
会很好,但可以手动实现(当Literal
转换已解决时)。
背景
我想模拟 C 的指定初始化程序;例如写类似的东西
const VECTORS: vectors!(DefaultHandler, {
23 => UartHandler,
42 => AdcHandler,
}
扩展到
static VECTORS: [HandlerType; 43] = {
DefaultHandler,
DefaultHandler,
...
UartHandler /* at index 23 */,
...
AdcHandler /* at index 42 */
}
解决方案
推荐阅读
- c++ - 使用模板化的arity存储在类函数中
- vue.js - 启用自动注入模式时,对子组件的 vee-validate 父 $validator 注入不起作用
- python - 在 for 循环中附加 pandas 在新列中获取不需要的值
- python - 我想知道未知的内容[警告:未知编解码器未知]
- javascript - 从对象javascript创建一个对象数组
- android - 如何知道设备HERE SDK中是否存在之前下载的离线地图
- git - 创建拉取请求后,Jenkins 管道脚本将持续运行
- cortana - cortana 是用什么语言编写的?
- xml - 如何将xml加载到draw.io图中?
- php - POST请求的PHP cURL CURLAUTH_NEGOTIATE问题