我有一个TokenStream
来自 Rust 函数的定义。我想用syn::parse
(和.unrwap()
)解析它。但是,我不知道返回类型应该是什么:
let ast: ??? = syn::parse(token_stream_from_function_definition).unwrap();
类型应该ast
是什么?
我有一个TokenStream
来自 Rust 函数的定义。我想用syn::parse
(和.unrwap()
)解析它。但是,我不知道返回类型应该是什么:
let ast: ??? = syn::parse(token_stream_from_function_definition).unwrap();
类型应该ast
是什么?
该syn::parse
函数尝试将 a 解析为您期望的TokenStream
任何内容。正如文档所说:
将源代码的标记解析为选定的语法树节点。
它需要一个类型参数,您通常使用类型推断来提供该参数。例如,如果您希望解析函数声明:
let fn_decl: syn::FnDecl = syn::parse(token_stream).unwrap();
如果它无法解析fn
声明,这将导致恐慌。
如果您不确切知道会发生什么,那么您可以更笼统,匹配一组可能性,然后检查您发现的内容。为可以出现在相同位置的语法组提供了一些枚举。例如,如果您在希望在同一级别上找到函数声明或其他一些声明的上下文中解析代码,您可能需要解析Item
并匹配所有可能的项目类型:
use syn::Item;
let item: Item = syn::parse(token_stream).unwrap();
match item {
Item::Fn(fn_decl) => {}
Item::Mod(mod_item) => {}
Item::Struct(struct_item) => {}
Item::Enum(enum_item) => {}
_ => {}
}
请注意,syn::Item
有 18 个变体要匹配,并且syn::Expr
有 40 个!绝对值得缩小可能性并选择最适合您需求的解析类型。您还可以考虑定义自己的类型,表示您希望找到的各种句法结构,然后syn::Parse
手动实现特征。