证明 struct field 的生命周期比另一个生命周期长

Proving struct field's lifetime outlives another lifetime

我正在研究 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

我花了很长时间尝试将输入生命周期贯穿所有类型,但我似乎永远无法证明词典的(因此,规则的处理程序)生命周期将 match/dominate 输入的.

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

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

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

所以 Handlers 不知道给予他们的 &strs 的生命周期。对于某些 '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.

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