在过程宏中,如何检查字符串是不是是有效的变量名而不是关键字?
Posted
技术标签:
【中文标题】在过程宏中,如何检查字符串是不是是有效的变量名而不是关键字?【英文标题】:In a procedural macro, how can I check if a string is a valid variable name and not a keyword?在过程宏中,如何检查字符串是否是有效的变量名而不是关键字? 【发布时间】:2020-03-15 03:43:21 【问题描述】:在一个过程宏中,我希望能够检查一个字符串是一个有效的变量名而不是一个关键字。
proc_macro2::Ident
会在尝试使用无效变量名时惊慌失措,但它会允许使用我不想被允许的关键字。在恐慌之前使用漂亮且有用的错误消息来处理错误也会更好。
是否有一些宏或函数(在 crate 中或其他地方)会检查字符串是否符合 rules about variable names?我可能可以用正则表达式来做到这一点,但龙生活在正则表达式中。
用例是处理用户输入字符串,其中可能包括垃圾字符串。
【问题讨论】:
【参考方案1】:您可以使用syn
crate 中的Ident::parse
。如果输入的是关键字,它将失败:
use syn::Ident, parse::Parse as _;
let ident = parse_stream.call(Ident::parse)?;
来自documentation:
使用
Ident::new
构造的标识符允许作为Rust 关键字,尽管通过其Parse
实现解析一个标识符会拒绝Rust 关键字。
【讨论】:
如果字符串实际上是一个字符串(比如来自一个文件)而不是一个流,你可以使用syn::parse_str::<syn::Ident>("my_ident_str")?;
来做你需要的事情以上是关于在过程宏中,如何检查字符串是不是是有效的变量名而不是关键字?的主要内容,如果未能解决你的问题,请参考以下文章
Python3 Flask 路由变量显示为变量名而不是从邮递员传递的值
在 Django 中从外键设置会话变量:需要字段名而不是主键
为啥在C语言中,“scanf”竟然可以作为自定义函数的函数名而不报错??