我正在Rust中研究词法分析器。
所需的API:
enum Token<'input> {
Name(&'input str)
}
let mut lexicon = LexiconBuilder::<Token>::new()
.token("[a-zA-Z]+", |s| Token::Name(s))
// among others
.build();
let mut lexer = Lexer::new(lexicon, "input");
这个想法是用户可以提供一个正则表达式,以及一个当正则表达式与输入文本匹配时运行的闭包。但是,我很难向生命周期检查器证明传递给
token()
闭包的切片的生命周期足够长。从我的POV来看,这似乎很安全,因为直到您提供字符串才返回 token 。Rust Playground link
我花了很长时间尝试通过所有类型对输入生存期进行线程化,但是我似乎无法证明词典(即规则的处理程序ergo)的生存期将匹配/控制输入的生存期。
最佳答案
type Handler<T> = fn(&str) -> T;
不是完整的类型。
&str
需要具有生存期,但未指定生存期。终身淘汰意味着这将扩展为type Handler<T> = for<'a> fn(&'a str) -> T;
因此,
Handler
并不知道将&str
给予它们的生命周期。对于某些'input
,要构造Rule<Token<'input>>
,则需要Handler<Token<'input>>
,但这意味着您需要for<'a> fn(&'a str) -> Token<'input>
,其中Token
需要&'input str
,但只有&'a str
。您需要将'input
设置为Handler
的参数,以便它可以限制将接受的参数:type Handler<'input, T> = fn(&'input str) -> T;
这必须通过您的所有其他类型传播。 Playground link。
您问题中的代码不完整,操场上的代码不匹配。如果您已经尝试过此方法,那么您将不得不更清楚地告诉我们出了什么问题。
关于rust - 证明struct字段的生命周期超过另一个生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59232056/