证明struct字段的寿命超过另一个寿命

时间:2019-12-08 02:56:14

标签: rust borrow-checker

我正在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来看,这似乎很安全,因为在您提供字符串之前不会返回令牌。

Rust Playground link

我花了很长时间尝试通过所有类型对输入生存期进行线程化,但是我似乎无法证明词典(即规则的处理程序ergo)的生存期将匹配/支配输入的生存期。

1 个答案:

答案 0 :(得分:5)

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需要一个{{1} },但您只有&'input str。您需要将&'a str设置为'input的参数,以便它可以限制将接受的参数:

Handler

这必须通过您所有其他类型传播。 Playground link

您问题中的代码不完整,操场上的代码不匹配。如果您已经尝试过,那么您将不得不更清楚地告诉我们出了什么问题。