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

标签 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来看,这似乎很安全,因为直到您提供字符串才返回 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/

相关文章:

iterator - 使用 HashMap 实现类 SQL RIGHT OUTER JOIN 的迭代器适配器

rust - 在嵌套的 lambda 中借用局部变量

rust - 不能作为不可变借用,因为它也作为可变借用

vector - 如何为向量的迭代器元素添加 Into 的类型注释?

struct - Rust 禁用结构构造

rust - 为什么对 Regex::find 的结果进行匹配会提示期望结构 regex::Match 但找到元组?

rust - Visitor 特性如何只允许部分实现?

rust - 如何在方法中获取对结构域的可变引用并调用其他方法而不会借用检查器提示? [复制]

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust - 从子结构中获取值,然后修改子结构 : a borrow checker puzzle?