Я хочу написать функцию A, которая принимает в качестве параметра функцию B, которая принимает в качестве параметра тип, параметризованный ссылочным типом, время жизни которого равно, по крайней мере, времени жизни локальных переменных в теле А.
Рассмотрим следующий пример:
struct Foo {}
fn consume(mut v: Vec<&Foo>) {
while let Some(..) = v.pop() {
// Do stuff
continue;
}
}
fn setup_and<F>(f: F)
where
F: FnOnce(&mut Vec<&Foo>) + Send,
{
let mut v: Vec<&Foo> = vec![];
let other_foo = Foo {};
f(&mut v);
v.push(&other_foo);
consume(v);
}
fn main() {
let foo = Foo {};
setup_and(|v| {
v.push(&foo);
});
}
rustc не может самостоятельно определить срок службы. Он жалуется:
error[E0597]: `foo` does not live long enough
--> src/main.rs:25:17
|
24 | setup_and(|v| {
| --- value captured here
25 | v.push(&foo);
| --------^^^-
| | |
| | borrowed value does not live long enough
| argument requires that `foo` is borrowed for `'static`
26 | });
27 | }
| - `foo` dropped here while still borrowed
Я пытался указать время жизни для ссылки, взятой setup_and
, вот так:
fn setup_and<'a, F>(f: F)
where
F: FnOnce(&mut Vec<&'a Foo>) + Send,
{
let mut v: Vec<&'a Foo> = vec![];
Теперь rustc жалуется на setup_and
локальную ссылку other_foo
не живет достаточно долго. Я предполагаю, что это потому, что он хочет большего времени жизни, чем область действия setup_and
.
Как бы я правильно связал времена жизни в этом случае? Я хотел бы выразить, что ссылки должны быть действительными до конца вызова consume
.