在编译时转换 proc_macro::Literal 背景

问题描述

如何将 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 */
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...