Rust
Tablice, wektory i plastry
Szukaj…
Tablice
Tablica jest alokowaną na stosie statyczną wielkością listą obiektów jednego typu.
Tablice są zwykle tworzone przez umieszczenie listy elementów danego typu w nawiasach kwadratowych. Typ tablicy jest oznaczony specjalną składnią: [T; N]
gdzie T
jest rodzajem jego elementów, a N
ich liczba, z których oba muszą być znane w czasie kompilacji.
Na przykład [4u64, 5, 6]
to 3-elementowa tablica typu [u64; 3]
. Uwaga: 5
i 6
można wywnioskować, że są typu u64
.
Przykład
fn main() {
// Arrays have a fixed size.
// All elements are of the same type.
let array = [1, 2, 3, 4, 5];
// Create an array of 20 elements where all elements are the same.
// The size should be a compile-time constant.
let ones = [1; 20];
// Get the length of an array.
println!("Length of ones: {}", ones.len());
// Access an element of an array.
// Indexing starts at 0.
println!("Second element of array: {}", array[1]);
// Run-time bounds-check.
// This panics with 'index out of bounds: the len is 5 but the index is 5'.
println!("Non existant element of array: {}", array[5]);
}
Ograniczenia
Dopasowywanie wzorców na tablicach (lub plasterkach) nie jest obsługiwane w stabilnej Rust (patrz # 23121 i wzory plasterków ).
Rdza nie obsługuje generyczności liczb na poziomie typu (patrz RFC # 1657 ). Dlatego nie można po prostu zaimplementować cechy dla wszystkich tablic (wszystkich rozmiarów). W rezultacie standardowe cechy są implementowane tylko dla tablic o ograniczonej liczbie elementów (ostatnio sprawdzane, do 32 włącznie). Obsługiwane są tablice z większą liczbą elementów, ale nie implementują standardowych cech (patrz dokumenty ).
Mamy nadzieję, że ograniczenia te zostaną zniesione w przyszłości.
Wektory
Wektor jest zasadniczo wskaźnikiem do dynamicznie przydzielanej sterty listy obiektów jednego typu.
Przykład
fn main() {
// Create a mutable empty vector
let mut vector = Vec::new();
vector.push(20);
vector.insert(0, 10); // insert at the beginning
println!("Second element of vector: {}", vector[1]); // 20
// Create a vector using the `vec!` macro
let till_five = vec![1, 2, 3, 4, 5];
// Create a vector of 20 elements where all elements are the same.
let ones = vec![1; 20];
// Get the length of a vector.
println!("Length of ones: {}", ones.len());
// Run-time bounds-check.
// This panics with 'index out of bounds: the len is 5 but the index is 5'.
println!("Non existant element of array: {}", till_five[5]);
}
Plastry
Plasterki są widokami na listę obiektów i mają typ [T]
, co wskazuje na wycinek obiektów typu T
Plasterek jest typem bez rozmiaru i dlatego można go używać tylko za wskaźnikiem. (Analogia świata ciągów: str
, zwana plasterkiem łańcucha, również nie ma wielkości.)
Tablice są wymuszane na plastry, a wektory można odrywać od siebie na plastry. Dlatego metody wycinania można zastosować do obu z nich. (Światowa analogia: str
jest String
, a [T]
Vec<T>
.)
fn main() {
let vector = vec![1, 2, 3, 4, 5, 6, 7, 8];
let slice = &vector[3..6];
println!("length of slice: {}", slice.len()); // 3
println!("slice: {:?}", slice); // [4, 5, 6]
}