#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())
}