Если тип элемента итератора равен String
, итератор возвращает принадлежащие строки. Итератор передает владение этими строками потребителю. Потребитель может изменить строки, поскольку он владеет ими.
Однако вы не можете использовать inspect()
для изменения элементов итератора. Закрытие, переданное inspect()
, получает неизменную ссылку на элементы итератора, которые нельзя использовать для изменения элементов. Правильный адаптер итератора для изменения элементов - map()
, так что это работает (но мне это не кажется особенно идиоматичным):
fn to_greetings<I>(names: I) -> impl Iterator<Item = String>
where
I: Iterator<Item = String>,
{
names.map(|mut name| { greet(&mut name); name })
}
Если вы действительно хотите изменить строки в каком-либо нижележащем контейнере, например, вектор строк, вам нужен другой подход, хотя. Изменяемый итератор над контейнером строк имеет тип элемента &mut String
, поэтому вам нужно использовать что-то вроде
fn to_greetings<'a, I>(names: I) -> impl Iterator<Item = &'a mut String>
where
I: Iterator<Item = &'a mut String>,
{
names.map(|name| { greet(name); name })
}