Вот более простое воспроизведение проблемы:
fn main() {
let mut a = (42, true);
match a {
(ref _i, true) => a = (99, false),
(ref _i, false) => a = (42, true),
}
println!("{:?}", a);
}
error[E0506]: cannot assign to `a` because it is borrowed
--> src/main.rs:4:27
|
4 | (ref _i, true) => a = (99, false),
| ------ ^^^^^^^^^^^^^^^ assignment to borrowed `a` occurs here
| |
| borrow of `a` occurs here
error[E0506]: cannot assign to `a` because it is borrowed
--> src/main.rs:5:28
|
5 | (ref _i, false) => a = (42, true),
| ------ ^^^^^^^^^^^^^^ assignment to borrowed `a` occurs here
| |
| borrow of `a` occurs here
Это слабость проверки заимствований на основе AST.Когда нелексические времена жизни включены, это работает как есть .Усовершенствованная проверка заимствований на основе MIR позволяет увидеть, что в точке, в которой вы пытаетесь заменить ее, нет заимствований соответствующей переменной.
Для чего бы вы ни стоили, ваш join
простоflat_map
:
input.iter().flat_map(|x| x)
Или flatten
:
input.iter().flatten()
Вы можете увидеть, как эти реализуютnext
для другой идеи:
fn next(&mut self) -> Option<Self::Item> {
loop {
if let Some(v) = self.inner_iter.as_mut().and_then(|i| i.next()) {
return Some(v);
}
match self.outer_iter.next() {
Some(x) => self.inner_iter = Some(x.into_iter()),
None => return None,
}
}
}
Это ясно показывает, что значение итератора не действительно заимствует у inner_iter
.
Не глядя на flatten
, я бы предпочел четко указать, что нет никакого дублирующего заимствования, если взять Option
и восстановить его, если оно равно Some
, как вы сделали:
match self.inner_iter.take() {
Some(mut it) => match it.next() {
Some(x) => {
self.inner_iter = Some(it);
return Some(x);
}
None => {
self.inner_iter = self.outer_iter.next().map(|it| it.into_iter());
}
},
None => {
return None;
}
}