Почему этому итератору требуется время жизни и как мне его ему предоставить?

#rust #iterator #lifetime

#Ржавчина #итератор #время жизни

Вопрос:

Я пытаюсь скомпилировать следующее:

 fn read<'a>(tokens: impl Iterator<Item=amp;'a str>) -> impl Iterator<Item=String> {
  tokens.map(|t| t.to_owned())
}
  
 error[E0482]: lifetime of return value does not outlive the function call
 --> src/lib.rs:1:53
  |
1 | fn read<'a>(tokens: impl Iterator<Item=amp;'a str>) -> impl Iterator<Item=String> {
  |                                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
note: the return value is only valid for the lifetime `'a` as defined on the function body at 1:9
 --> src/lib.rs:1:9
  |
1 | fn read<'a>(tokens: impl Iterator<Item=amp;'a str>) -> impl Iterator<Item=String> {
  |         ^^
  

Ссылка на игровую площадку: https://play.rust-lang.org/?version=stableamp;mode=debugamp;edition=2018amp;gist=55460a8b17ff10e30b56a9142338ec19

Что для меня странно, так это то, что возвращаемое значение вообще связано со временем жизни; его содержимое принадлежит и передается напрямую наружу.

Я наткнулся на это сообщение в блоге:https://blog.katona.me/2019/12/29/Rust-Lifetimes-and-Iterators /

но ни один из них не сработал:

 fn read<'a>(tokens: impl Iterator<Item=amp;'a str>) -> impl Iterator<Item=String>   '_ {
  
 fn read<'a>(tokens: impl Iterator<Item=amp;'a str>) -> impl Iterator<Item=String>   'a {
  

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

Комментарии:

1. «его содержимое принадлежит и передается непосредственно наружу» — это неверно, итераторы ленивы, .map(...) просто создает std::iter::Map , который сохраняет исходный итератор

Ответ №1:

Я решил это, добавив 'a к обоим итераторам:

 fn read<'a>(tokens: impl Iterator<Item=amp;'a str>   'a) -> impl Iterator<Item=String>   'a {
  tokens.map(|t| t.to_owned())
}