首页 > 解决方案 > 证明 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,规则的处理程序)的生命周期将匹配/支配输入的生命周期。

标签: rustborrow-checker

解决方案


type Handler<T> = fn(&str) -> T;

不是一个完整的类型。&str需要有一个生命周期,但没有指定。终身省略意味着这扩展到

type Handler<T> = for<'a> fn(&'a str) -> T;

所以Handlers 不知道&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 中的代码与它不匹配。如果您已经尝试过,那么您将不得不更清楚地告诉我们出了什么问题。


推荐阅读