Следующий код, использующий преимущество жизненного цикла, компилируется:
fn g(a: &mut str, closure: impl Fn(&mut str, &str) -> ()) {
let data = vec![];
for d in data.iter() {
closure(a, d);
}
}
Однако, предположим, что мне нужно явно указать время жизни переменных в замыкании (в моем случае коллсайт неоднозначен)если я не сделаю так).Если я добавлю время жизни явно, компилятор пожалуется, что a
непостоянно заимствовано в предыдущих итерациях замыкания.
fn g<'b, 'd>(a: &'b mut str, closure: impl Fn(&'d mut str, &str) -> ()) {
let data: Vec<&str> = vec![];
'd: for d in data.iter() {
closure(a, d);
}
}
warning: label name `'d` shadows a lifetime name that is already in scope
--> src/lib.rs:3:5
|
1 | fn g<'b, 'd>(a: &'b mut str, closure: impl Fn(&'d mut str, &str) -> ()) {
| -- first declared here
2 | let data: Vec<&str> = vec![];
3 | 'd: for d in data.iter() {
| ^^ lifetime 'd already in scope
error[E0312]: lifetime of reference outlives lifetime of borrowed content...
--> src/lib.rs:4:17
|
4 | closure(a, d);
| ^
|
note: ...the reference is valid for the lifetime 'd as defined on the function body at 1:10...
--> src/lib.rs:1:10
|
1 | fn g<'b, 'd>(a: &'b mut str, closure: impl Fn(&'d mut str, &str) -> ()) {
| ^^
note: ...but the borrowed content is only valid for the lifetime 'b as defined on the function body at 1:6
--> src/lib.rs:1:6
|
1 | fn g<'b, 'd>(a: &'b mut str, closure: impl Fn(&'d mut str, &str) -> ()) {
| ^^
Я предполагаю, что это потому, что компилятор не догадывается, что я намерен только 'd
длиться для каждой итерации цикла.Я искал способ сослаться на время жизни, но все, что я смог найти, - это то, что у меня есть возможность указать «время жизни или метку» в справочнике Rust, которая, по-видимому, является меткой для всех намерений и целей.
Есть ли способ явно указать, каково время жизни каждой итерации цикла, или иным образом явно записать то, что компилятор исключил в первом примере?