Chciałbym wziąć plastry zmienne i skopiować zawartość na dwa nowe plasterki. Każdy kawałek jest połową oryginału.Jak utworzyć dwa nowe plasterki z jednym plasterkiem?
Moja próba nr 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);
wyjściowa:
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();
| ^^^^^
Moja próba # 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);
wyjściowa:
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()`
mogę użyć dwóch Vec<u8>
i tylko pętlę nad wejściem i wcisnąć sklonowane wartości Chyba, ale miałem nadzieję tam był ładniejszy sposób, aby to zrobić:
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);
}
Miło, nie zdawałem sobie sprawy, że ta funkcja istnieje. –
Niezły, zdecydowanie najczystszy, jaki widziałem do tej pory. Czy jest jakaś wada przy korzystaniu z Vec vs & [] lub & mut []? Oczywiście Vec jest łatwiejszy w obsłudze, ale wydaje się, że może być trochę narzut. – user439299
Plasterek jest tylko reprezentacją, jeśli wywołasz as_slice(), pożyczy referencję do wektora, ale nie stworzy nowego. W razie wątpliwości sprawdź parametry życia (http://doc.rust-lang.org/std/vec/struct.Vec.html#method.as_slice), ma to samo żywotność co wektor. – snf