我想采取一个可变切片并将内容复制到两个新的可变切片中。每个切片都是原始切片的一半。
我的尝试#1:
let my_list: &mut [u8] = &mut [0, 1, 2, 3, 4, 5];
let list_a: &mut [u8] = my_list[0..3].clone();
let list_b: &mut [u8] = my_list[3..6].clone();
println!("{:?}", my_list);
println!("{:?}", list_a);
println!("{:?}", list_b);
输出:
error: no method named `clone` found for type `[u8]` in the current scope
--> src/main.rs:3:43
|
3 | let list_a: &mut [u8] = my_list[0..3].clone();
| ^^^^^
error: no method named `clone` found for type `[u8]` in the current scope
--> src/main.rs:4:43
|
4 | let list_b: &mut [u8] = my_list[3..6].clone();
| ^^^^^
我的尝试#2:
let my_list: &mut [u8] = &mut [0, 1, 2, 3, 4, 5];
let list_a: &mut [u8] = my_list[0..3].to_owned();
let list_b: &mut [u8] = my_list[3..6].to_owned();
println!("{:?}", my_list);
println!("{:?}", list_a);
println!("{:?}", list_b);
输出:
error[E0308]: mismatched types
--> src/main.rs:12:29
|
12 | let list_a: &mut [u8] = my_list[0..3].to_owned();
| ^^^^^^^^^^^^^^^^^^^^^^^^ expected &mut [u8], found struct `std::vec::Vec`
|
= note: expected type `&mut [u8]`
found type `std::vec::Vec<u8>`
= help: try with `&mut my_list[0..3].to_owned()`
error[E0308]: mismatched types
--> src/main.rs:13:29
|
13 | let list_b: &mut [u8] = my_list[3..6].to_owned();
| ^^^^^^^^^^^^^^^^^^^^^^^^ expected &mut [u8], found struct `std::vec::Vec`
|
= note: expected type `&mut [u8]`
found type `std::vec::Vec<u8>`
= help: try with `&mut my_list[3..6].to_owned()`
我可以使用两个Vec<u8>
并且只是循环输入并推送克隆值我猜,但我希望有更好的方法来做到这一点:
extern crate rand;
use rand::{thread_rng, Rng};
fn main() {
let my_list: &mut [u8] = &mut [0; 100];
thread_rng().fill_bytes(my_list);
let list_a = &mut Vec::new();
let list_b = &mut Vec::new();
for i in 0..my_list.len() {
if i < my_list.len() / 2 {
list_a.push(my_list[i].clone());
} else {
list_b.push(my_list[i].clone());
}
}
println!("{:?}", list_a.as_slice());
println!("{:?}", list_b.as_slice());
println!("{:?}", my_list);
}
答案 0 :(得分:11)
split_at
和split_at_mut
方法会为您提供两个切片,如果借用检查器允许,您可以复制甚至安全使用这些切片而无需复制。
let (list_a, list_b) = my_list.split_at_mut(my_list.len()/2)
答案 1 :(得分:6)
您可以通过使用多种方法克隆元素直接从切片构建载体:
Vec::to_vec
From
/ Into
ToOwned
fn main() {
let my_list: &mut [u8] = &mut [0, 1, 2, 3, 4, 5];
let mut vec1 = my_list[0..2].to_vec();
let mut vec2: Vec<u8> = my_list[2..4].into();
let mut vec3 = my_list[2..6].to_owned();
println!("{:?}", vec1);
println!("{:?}", vec2);
}
您的原始问题是由于所有这些问题都返回Vec
但您试图声称它是一个切片,相当于:
let thing: &mut [u8] = Vec::new();
答案 2 :(得分:2)
您可以在切片上链接两个迭代器。
let my_list: &mut [u8] = &mut [0, 1, 2, 3, 4, 5];
let mut slices = my_list[0..3].iter().chain(my_list[3..6].iter());
for e in slices {}
chain
将遍历第一个迭代器,然后遍历第二个迭代器。
创建新列表:
let my_list: &mut [u8] = &mut [0, 1, 2, 3, 4, 5];
let mut a: Vec<u8> = my_list[0..3].iter().cloned().collect();
let mut b: Vec<u8> = my_list[3..6].iter().cloned().collect();