这是问题的更简单的再现:
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)
Or a 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,
}
}
}
这清楚地表明迭代器值不really从...借inner_iter
.
不看的情况下flatten
,我会选择明确表明不存在重叠借用taking the 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;
}
}