Можно ли явно указать время жизни итерации цикла? - PullRequest
0 голосов
/ 29 декабря 2018

Следующий код, использующий преимущество жизненного цикла, компилируется:

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, которая, по-видимому, является меткой для всех намерений и целей.

Есть ли способ явно указать, каково время жизни каждой итерации цикла, или иным образом явно записать то, что компилятор исключил в первом примере?

1 Ответ

0 голосов
/ 29 декабря 2018

Можно ли явно указать время жизни итерации цикла?

Нет.Такая вещь просто не нужна.


Вы не предоставили MCVE, соответствующий вашей первоначальной проблеме, поэтому невозможно найти решение, которое решит эту проблему.Мои интуитивные способности и ваш комментарий «напишите, что упустил компилятор», скажите мне, что вы, вероятно, должны посмотреть на:

TL;DR:

fn g(a: &mut str, closure: impl for<'a, 'd> Fn(&'a mut str, &'d str) -> ())
...