Я хочу создать итератор для строки с разделителями, чтобы каждая подстрока, разделенная разделителем, возвращалась на каждой итерации вместе с подстрокой из предыдущей итерации, включая разделитель.
Например, для данной строки "ab:cde:fg"
, итератор должен вернуть следующее:
"ab"
"ab:cde"
"ab:cde:fg"
Простое решение
Простое решение состоит в том, чтобы просто перебрать коллекцию, возвращенную после разделения на разделителе, отслеживая предыдущий путь:
let mut state = String::new();
for part in "ab:cde:fg".split(':') {
if !state.is_empty() {
state.push_str(":");
}
state.push_str(part);
dbg!(&state);
}
Недостатком здесь является необходимость явно отслеживать состояние с помощью дополнительной изменяемой переменной.
Использование scan
Я думал, что scan
можно использовать для скрытия состояния:
"ab:cde:fg"
.split(":")
.scan(String::new(), |state, x| {
if !state.is_empty() {
state.push_str(":");
}
state.push_str(x);
Some(&state)
})
.for_each(|x| { dbg!(x); });
Однако эта ошибка завершается ошибкой:
не может вывести подходящее время жизни для выражения заимствования из-за противоречивых требований
Что такое проблема с scan
v ersion и как это можно исправить?