gpt4 book ai didi

rust - 我可以将向量中子向量的项添加到同一向量中的另一个子向量吗?

转载 作者:行者123 更新时间:2023-12-03 11:47:06 25 4
gpt4 key购买 nike

我正在编写代码,我的意思是将向量保存在更大的向量中。
稍后,我想将其中一个向量的值附加到另一个向量,并删除已转移其值的向量。
我做了两次尝试都失败了,如果有人可以帮助我,我将非常感激!
我使用的代码如下所示:

fn my_func(distribution: (u16, u8, u8, u8, u8, u8)) {
let mut covered: Vec<(Vec<usize>, u16)> = vec![
(vec![0], distribution.1.into()),
(vec![1], distribution.2.into()),
(vec![2], distribution.3.into()),
(vec![3], distribution.4.into()),
(vec![4], distribution.5.into()),
];

// Attempt 1 - Error: borrowed as mutable more than once
&covered[0].0.append(&mut covered[1].0);

// Attempt 2 - Error: borrowed as mutable and immutable
for i in &covered[1].0 {
&covered[0].0.push(*i);
}
}
我对Rust还是比较陌生,所以我仍在学习借款的复杂性。
有人可以帮我理解我要完成的目标吗?
也欢迎任何其他有关我的编码风格或其他错误的评论。

最佳答案

假设我正确理解了您要执行的操作。然后,您尝试从covered的2个不同索引处可变地借用。您的方法不起作用,因为covered[0]导致整个Vec都是可变地借用的。您只能获得1个可变引用,这就是随后的covered[1]导致错误的原因。
实现您正在尝试的一种解决方案是使用 split_at_mut() 。然后,您可以从covered获得2个可变切片,然后可以对每个切片进行索引。
这与所谓的"Splitting Borrows"有关。

fn func(distribution: (u16, u8, u8, u8, u8, u8)) {
let mut covered: Vec<(Vec<usize>, u16)> = vec![
(vec![0], distribution.1.into()),
(vec![1], distribution.2.into()),
(vec![2], distribution.3.into()),
(vec![3], distribution.4.into()),
(vec![4], distribution.5.into()),
];

let (left, right) = covered.split_at_mut(1);

let v0 = &mut left[0];
let v1 = &mut right[0];

// Now both this
v0.0.append(&mut v1.0);

// and this works
for i in &v1.0 {
v0.0.push(*i);
}
}
请注意,正如注释中提到的Aplet123一样, append() other的所有元素移到 Vec的位置,使其保留为空。如果您不希望清除 other Vec,请改用 extend() extend_from_slice()

如果您事先知道可以从 Vec中删除该项目。然后,在这种情况下,您无需使用 split_at_mut()。然后,您可以按照RedBorg的说明进行操作,只需 remove() 该项目并按其他方式借用即可。
fn my_func(distribution: (u16, u8, u8, u8, u8, u8)) {
let mut covered: Vec<(Vec<usize>, u16)> = vec![
(vec![0], distribution.1.into()),
(vec![1], distribution.2.into()),
(vec![2], distribution.3.into()),
(vec![3], distribution.4.into()),
(vec![4], distribution.5.into()),
];

let mut v1 = covered.remove(1);
let v0 = &mut covered[0];

// Now both this
v0.0.append(&mut v1.0);

// and this works
for i in &v1.0 {
v0.0.push(*i);
}
}

关于rust - 我可以将向量中子向量的项添加到同一向量中的另一个子向量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65386153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com