Learn Rust Coding · Lekcja

Wektory struktur

Przechowa Pan/Pani złożone dane w Vec.

Lekcja 4 z 413 kroki

Wektory struktur to bezpłatna lekcja Learn Rust Coding na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Learn Rust Coding, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Learn Rust Coding zawiera 4 lekcji w sumie.

Dlaczego wektory struktur

Wektory mogą przechowywać wartości dowolnego jednego typu, w tym własne struktury. Wartość Vec<Person> przechowuje wiele osób w określonej kolejności, co świetnie sprawdza się w przypadku list rekordów, takich jak użytkownicy, elementy czy wyniki.

Łączy to własne struktury danych z listą o zmiennej długości.

Definiowanie struktury

Najpierw należy zdefiniować strukturę, którą chcą Państwo przechowywać. Ta struktura Person ma imię i wiek.

Wiersz #[derive(Debug)] pozwala wyświetlać osobę za pomocą {:?}, co jest przydatne przy wyświetlaniu całych wektorów.

#[derive(Debug)]
struct Person {
    name: String,
    age: u32,
}

Tworzenie wektora

Należy utworzyć instancje struktury, a następnie zebrać je w makrze vec!. Typ wektora automatycznie staje się Vec<Person>.

Użyj {:?}, aby wyświetlić wszystkie rekordy naraz.

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 25 },
    ];
    println!("{:?}", people);
}

Dodawanie struktur za pomocą push

Można też zacząć od pustego wektora i dodawać struktury pojedynczo za pomocą push. Aby można było go powiększać, wektor musi być oznaczony jako mut.

Ten wzorzec sprawdza się, gdy rekordy napływają z czasem, na przykład z danych wprowadzanych przez użytkownika.

#[derive(Debug)]
struct Item { name: String }

fn main() {
    let mut cart = Vec::new();
    cart.push(Item { name: String::from("Pen") });
    cart.push(Item { name: String::from("Mug") });
    println!("{:?}", cart);
}

Iterowanie po rekordach

Iteruj po &people, aby odczytać każdą strukturę bez przejmowania własności. Wewnątrz pętli można uzyskać dostęp do pól za pomocą notacji kropkowej, na przykład p.name.

Spowoduje to wyświetlenie przyjaznego komunikatu dla każdego rekordu.

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 25 },
    ];
    for p in &people {
        println!("{} is {}", p.name, p.age);
    }
}

Odczytywanie pojedynczego pola

Użyj indeksu wektora, aby uzyskać dostęp do jednej struktury, a następnie użyj notacji kropkowej, aby odczytać jej pole. Zatem people[0].name zwraca imię pierwszej osoby.

Pamiętaj, że indeksy zaczynają się od 0, a dostęp poza zakresem powoduje panikę.

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
    ];
    println!("name: {}", people[0].name);
}

Zmienianie wartości pola

Aby edytować rekord, wektor musi być oznaczony jako mut. Następnie należy uzyskać dostęp do struktury za pomocą indeksu i przypisać wartość jej polu, na przykład people[0].age = 31.

Aktualizuje to przechowywane dane bezpośrednio w miejscu.

struct Person { name: String, age: u32 }

fn main() {
    let mut people = vec![
        Person { name: String::from("Ann"), age: 30 },
    ];
    people[0].age = 31;
    println!("{}", people[0].age);
}

Sumowanie wartości pola

Iteratory mogą pobrać jedno pole z każdego rekordu. W tym przykładzie iter().map(|p| p.age).sum() sumuje wszystkie wartości wieku.

Etap map zamienia każdą osobę tylko na jej wiek, zanim nastąpi sumowanie.

struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    let total: u32 = people.iter().map(|p| p.age).sum();
    println!("total age = {}", total);
}

Filtrowanie rekordów

Użyj iter().filter(...), aby zachować rekordy spełniające określoną regułę. Closure zwraca wartość typu bool dla każdej struktury.

W tym przykładzie zliczamy osoby w wieku co najmniej 30 lat.

struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    let adults = people.iter().filter(|p| p.age >= 30).count();
    println!("adults: {}", adults);
}

Sortowanie według pola

Sortuj rekordy według pola za pomocą sort_by_key. Przekaż closure zwracające wartość, według której ma odbywać się sortowanie, na przykład wiek.

Wektor musi być oznaczony jako mut, ponieważ sortowanie zmienia jego kolejność.

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let mut people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    people.sort_by_key(|p| p.age);
    println!("{:?}", people);
}

Zliczanie rekordów

Liczbę przechowywanych struktur zwraca po prostu len(), tak jak w przypadku każdego wektora. Informuje ona, ile rekordów znajduje się obecnie w wektorze.

Połącz ją z is_empty(), aby sprawdzić, czy można bezpiecznie odczytać pierwszy rekord.

struct Item { name: String }

fn main() {
    let cart = vec![
        Item { name: String::from("Pen") },
        Item { name: String::from("Mug") },
    ];
    println!("items: {}", cart.len());
}

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat wektorów struktur.

Podsumowanie

Przechowywali Państwo struktury w Vec, tworzyli wektor za pomocą vec! i push, a także odczytywali i edytowali pola według indeksu oraz w pętlach.

Sumowali Państwo również wartości, filtrowali i sortowali rekordy według pola oraz je zliczali. Mogą już Państwo zarządzać listami uporządkowanych danych za pomocą wektorów.

Bezpłatny start

Ucz się Rust dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
39
Lekcje
144

Często zadawane pytania

Czy lekcja „Wektory struktur” jest bezpłatna?

Tak — pełny tekst „Wektory struktur” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Learn Rust Coding, przejdź na CoddyKit PRO. Kurs Learn Rust Coding zawiera 4 lekcji w sumie.

Co nauczysz się w „Wektory struktur”?

Przechowa Pan/Pani złożone dane w Vec. Ćwiczysz Learn Rust Coding z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Learn Rust Coding?

Nie wymagamy żadnego doświadczenia. Learn Rust Coding w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Wektory struktur”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Learn Rust Coding?

Tak. Każda lekcja Learn Rust Coding zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Tworzenie i wypełnianie wektorów
  2. Indeksowanie i iterowanie
  3. Powiększanie i zmniejszanie
  4. Wektory struktur
← Powrót do Learn Rust Coding