rust - 证明 struct 字段的生命周期超过另一个生命周期
问题描述
我正在使用 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()
's 闭包的切片寿命足够长。从我的 POV 来看,这似乎是安全的,因为在您提供字符串之前不会返回令牌。
我花了很长时间尝试通过所有类型来线程输入生命周期,但是我似乎无法证明词典(ergo,规则的处理程序)的生命周期将匹配/支配输入的生命周期。
解决方案
type Handler<T> = fn(&str) -> T;
不是一个完整的类型。&str
需要有一个生命周期,但没有指定。终身省略意味着这扩展到
type Handler<T> = for<'a> fn(&'a str) -> T;
所以Handler
s 不知道&str
给他们的 s 的生命周期。对于某些人来说'input
,要构造 a Rule<Token<'input>>
,您需要 a Handler<Token<'input>>
,但这意味着您需要for<'a> fn(&'a str) -> Token<'input>
,其中Token
想要 a&'input str
但您只有 a &'a str
。您需要创建'input
一个参数Handler
,以便它可以限制它将接受的参数:
type Handler<'input, T> = fn(&'input str) -> T;
这必须通过所有其他类型传播。游乐场链接。
您问题中的代码不完整,并且 Playground 中的代码与它不匹配。如果您已经尝试过,那么您将不得不更清楚地告诉我们出了什么问题。
推荐阅读
- python - 为什么在构建 dict() 时会出现 TypeError?
- node.js - Dialogflow - 多个 agent.add 响应(nodejs)
- r - 为什么我的 anova 不能在闪亮的应用程序中工作
- qt-creator - QtCreator 在启动“文件错误”时崩溃
- amcharts - amcharts - 在图表外使用我自己的按钮导出图表
- python - 如何将数据添加到空 pd.dataframe python
- android - 单元测试,使用 PowerMock 在 Kotlin 中使用 Context 作为变量来模拟静态方法
- node.js - nodejs并发下如何正确使用redis的GET SET命令?
- bash - 将 aws 命令中提取的值分配给 jenkins 管道中的变量
- angularjs - 在新浏览器中打开链接将我重定向到 Angular JS 中的登录页面