我试图在同一个vec上调用两次“拼接”方法。
我知道它失败的原因:规则是有道理的。我不知道的是如何完成我想要的。有没有办法向编译器证明什么都不会出错?
fn main() {
let mut x = vec![1, 2, 3, 4, 5];
let y = x.splice(2.., []);
let z = x.splice(2.., []);
println!("{:?}", x);
println!("{:?}", y);
println!("{:?}", z);
}发布于 2022-03-19 05:58:33
您不能证明您的代码不会出错,因为某些事情会按照您编写的方式出错!
splice()返回的值有点特殊。这是一个Splice结构。向量仍然拥有您要求它在splice()返回后立即删除的元素。
Splice是Iterator。当您迭代它时,它会将值从原始向量中移出以生成它们。
当删除Splice值时,将枚举替换项并将其移到向量中。因此,当Splice存在时,拼接操作处于部分完成状态.
现在应该很清楚为什么不能再次调用.splice(),而来自同一向量的Splice仍然存在--向量仍然是可变借用的,因为拼接还没有完成。
要解决问题,在尝试使用向量执行任何其他操作之前,需要删除任何现存的Splice值。看起来,您想要将删除的元素移动到一个新的向量中,所以您可以只使用.collect()的Splice,在一个语句中这样做会将Splice放在语句的末尾,因为它是临时的。
let y = x.splice(2.., []).collect::<Vec<_>>();
let z = x.splice(2.., []).collect::<Vec<_>>();(游乐场)
https://stackoverflow.com/questions/71535564
复制相似问题