Заимствованное значение не живет достаточно долго при переборе общего значения с временем жизни в теле функции - PullRequest
0 голосов
/ 26 ноября 2018
fn func<'a, T>(arg: Vec<Box<T>>)
where
    String: From<&'a T>,
    T: 'a,
{
    let s: Vec<String> = arg.iter().map(|s| String::from(s)).collect();
    do_something_else(arg);
}

fn do_something_else<T>(arg: Vec<Box<T>>) {}

Компилятор жалуется, что arg не живет достаточно долго.Почему, хотя?

error[E0597]: `arg` does not live long enough
 --> src/lib.rs:6:26
  |
6 |     let s: Vec<String> = arg.iter().map(|s| String::from(s)).collect();
  |                          ^^^ borrowed value does not live long enough
7 |     do_something_else(arg);
8 | }
  | - borrowed value only lives until here
  |
note: borrowed value must be valid for the lifetime 'a as defined on the function body at 1:9...
 --> src/lib.rs:1:9
  |
1 | fn func<'a, T>(arg: Vec<Box<T>>)
  |         ^^

1 Ответ

0 голосов
/ 26 ноября 2018

Ограничение String: From<&'a T> с акцентом на параметр времени жизни функции 'a позволит вам преобразовать ссылку на T в String.Однако ссылка на элементы, полученные из итератора , более ограничительна , чем 'a (следовательно, они не живут достаточно долго).

Поскольку преобразование должно работать нормально дляссылки на любое время жизни, вы можете заменить ограничение на более высокую оценку ранга (HRTB):

fn func<T>(arg: Vec<Box<T>>)
where
    for<'a> String: From<&'a T>,
{
    let s: Vec<String> = arg.iter().map(|s| String::from(s)).collect();
    do_something_else(arg);
}

Использование From здесь для получения собственной строки также не то, что я видел вдикийВозможно, вас заинтересует черта Display, чтобы вы могли позвонить to_string():

fn func<T>(arg: Vec<Box<T>>)
where
    T: Display,
{
    let _: Vec<_> = arg.iter().map(|s| s.to_string()).collect();
    // ...
}

См. Также:

...