我有以下代码:
struct Solver<'a> {
guesses: Vec<&'a str>,
}
impl<'a> Solver<'a> {
fn register_guess(&mut self, guess: &'a str) {
self.guesses.push(guess);
}
}
fn foo(mut solver: Solver, guess: &str) {
solver.register_guess(guess)
}
它无法编译:
|
11 | fn foo(mut solver: Solver, guess: &str) {
| ---------- - let's call the lifetime of this reference `'1`
| |
| has type `Solver<'2>`
12 | solver.register_guess(guess)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ argument requires that `'1` must outlive `'2`
错误信息显示参数
guess
必须比solver
存在更久的时间。在我看来,这是显然正确的:函数结束时solver
的生命周期结束了,但guess
的生命周期却没有结束。这似乎是编译器应该能够推断并且不会出错的内容。为什么编译器不能这样做呢?这段代码实际上有
solver
可以比guess
存在更长时间的方法吗?还是说编译器根本不尝试进行这种推断?我知道如何解决这个问题——将函数改成
fn foo<'a>(mut solver: Solver<'a>, guess: &'a str)
——但我想问的是为什么我必须这样做。