Функция Rust, которая принимает итератор и возвращает итератор с измененными элементами? - PullRequest
0 голосов
/ 25 января 2019

Я хочу написать функцию, которая принимает один итератор в качестве входных данных и возвращает итератор с теми же элементами, но с мутацией. Как в этом примере:

fn greet(name: &mut String) {
    name.insert_str(0, "Hello ");
}

fn to_greetings(names: impl Iterator<Item = String>) -> impl Iterator<Item = String> {
    names.inspect(|name| greet(name))
}

Это не компилируется, поскольку name не является изменяемым. Я пытался добавить mut в разных местах, не понимая, что я делаю, но безуспешно. Как мне исправить приведенный выше код?

Полагаю, мне нужно сделать элементы изменяемыми, но, очевидно, Item = mut String - синтаксическая ошибка.

1 Ответ

0 голосов
/ 26 января 2019

Если тип элемента итератора равен 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 })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...