首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相同数据结构的不可变Borrow

相同数据结构的不可变Borrow
EN

Stack Overflow用户
提问于 2022-03-19 05:15:43
回答 1查看 53关注 0票数 0

我试图在同一个vec上调用两次“拼接”方法。

我知道它失败的原因:规则是有道理的。我不知道的是如何完成我想要的。有没有办法向编译器证明什么都不会出错?

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-19 05:58:33

您不能证明您的代码不会出错,因为某些事情会按照您编写的方式出错!

splice()返回的值有点特殊。这是一个Splice结构。向量仍然拥有您要求它在splice()返回后立即删除的元素。

SpliceIterator。当您迭代它时,它会将值从原始向量中移出以生成它们。

当删除Splice值时,将枚举替换项并将其移到向量中。因此,当Splice存在时,拼接操作处于部分完成状态.

现在应该很清楚为什么不能再次调用.splice(),而来自同一向量的Splice仍然存在--向量仍然是可变借用的,因为拼接还没有完成。

要解决问题,在尝试使用向量执行任何其他操作之前,需要删除任何现存的Splice值。看起来,您想要将删除的元素移动到一个新的向量中,所以您可以只使用.collect()Splice,在一个语句中这样做会将Splice放在语句的末尾,因为它是临时的。

代码语言:javascript
复制
    let y = x.splice(2.., []).collect::<Vec<_>>();
    let z = x.splice(2.., []).collect::<Vec<_>>();

(游乐场)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71535564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档