证明 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 来看,这似乎是安全的,因为在您提供字符串之前不会返回令牌。
我花了很长时间尝试将输入生命周期贯穿所有类型,但我似乎永远无法证明词典的(因此,规则的处理程序)生命周期将 match/dominate 输入的.
type Handler<T> = fn(&str) -> T;
不是完整类型。 &str
需要有生命周期,但没有指定。终身省略意味着这会扩展到
type Handler<T> = for<'a> fn(&'a str) -> T;
所以 Handler
s 不知道给予他们的 &str
s 的生命周期。对于某些 '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中的代码不匹配。如果您已经尝试过此操作,那么您将不得不更清楚地告诉我们哪里出了问题。
我正在研究 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 来看,这似乎是安全的,因为在您提供字符串之前不会返回令牌。
我花了很长时间尝试将输入生命周期贯穿所有类型,但我似乎永远无法证明词典的(因此,规则的处理程序)生命周期将 match/dominate 输入的.
type Handler<T> = fn(&str) -> T;
不是完整类型。 &str
需要有生命周期,但没有指定。终身省略意味着这会扩展到
type Handler<T> = for<'a> fn(&'a str) -> T;
所以 Handler
s 不知道给予他们的 &str
s 的生命周期。对于某些 '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中的代码不匹配。如果您已经尝试过此操作,那么您将不得不更清楚地告诉我们哪里出了问题。