gpt4 book ai didi

rust - 证明struct字段的生命周期超过另一个生命周期

转载 作者:行者123 更新时间:2023-12-03 11:40:55 25 4
gpt4 key购买 nike

我正在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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com