将字符串转换为TokenStream

9

如何将一个字符串(str)转换为 Rust 中的 TokenStream

我尝试使用 quote! 宏。

let str = "4";
let tokens = quote! { let num = #str; }; // #str is a str not i32

这里的目标是为一些未知的代码字符串生成令牌。

let thing = "4";
let tokens = quote! { let thing = #thing }; // i32

或者

let thing = ""4"";
let tokens = quote! { let thing = #thing }; // str

1
你的问题没有意义。在标题中,你想知道如何将一个字符串转换为TokenStream,但在你的文本中,你抱怨str不是i32,这是一个完全不同的问题。 - hellow
这肯定可能不行。我会更新问题并提供更多细节以澄清。 - garrettmaring
你的标题仍然与你的问题不符。 - hellow
1
我真的觉得你们两个都在使用错误的工具,并试图解决与你们所面临的问题不同的问题。为什么要从已知结构的代码中获取TokenStream,而附加的类型数据又来自哪里(即使在你的示例中,thing的类型很可能是u8i16或任何其他符合4的类型)。你到底想解析什么? - Sébastien Renauld
@hellow 我不同意。我想知道如何将诸如“(1,2)”,“func(1)”,“4”之类的字符串转换为TokenStreams。 - garrettmaring
显示剩余4条评论
1个回答

21
如何将一个字符串转换为TokenStream?
Rust有一个通用的trait用于在转换失败时将字符串转换为值:FromStr。通常可以通过&str上的parse方法访问。

proc_macro2::TokenStream

use proc_macro2; // 0.4.24

fn example(s: &str) {
    let stream: proc_macro2::TokenStream = s.parse().unwrap();
}

proc_macro::TokenStream

extern crate proc_macro;

fn example(s: &str) {
    let stream: proc_macro::TokenStream = s.parse().unwrap();
}

请注意,这段代码不能在实际过程宏的调用之外运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接