0Pricing
Learn Rust Coding · Lekcja

Entry API i wartości domyślne

Będzie Pan/Pani ergonomicznie aktualizować wartości.

Entry API i wartości domyślne to bezpłatna lekcja Learn Rust Coding na CoddyKit. To lekcja 2 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 Entry API?

Często chcą Państwo zaktualizować wartość, jeśli klucz istnieje, albo wstawić wartość domyślną, jeśli go nie ma.

Wykonanie tego za pomocą get i insert jest niewygodne. API entry robi to przejrzyście w jednym kroku.

entry zwraca miejsce

Wywołanie entry(key) daje uchwyt do miejsca danego klucza w mapie.

Za pomocą tego uchwytu można zdecydować, co zrobić: wstawić wartość domyślną albo zmodyfikować istniejącą wartość.

use std::collections::HashMap;

fn main() {
    let mut m: HashMap<&str, i32> = HashMap::new();
    m.entry("a").or_insert(0);
    println!("{}", m["a"]);
}

or_insert

or_insert(default) wstawia wartość domyślną tylko wtedy, gdy brakuje klucza, a następnie zwraca mutowalną referencję do wartości.

Jeśli klucz już istnieje, wartość domyślna jest ignorowana i otrzymują Państwo istniejącą wartość.

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    m.insert("a", 10);
    m.entry("a").or_insert(99);
    m.entry("b").or_insert(99);
    println!("a={}, b={}", m["a"], m["b"]);
}

Modyfikowanie przez referencję

Ponieważ or_insert zwraca mutowalną referencję, można od razu zmienić wartość.

Użyj *, aby wyłuskać wartość i zaktualizować ją bezpośrednio. To podstawa zliczania.

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    let count = m.entry("hits").or_insert(0);
    *count += 1;
    *count += 1;
    println!("hits = {}", m["hits"]);
}

Zliczanie w pętli

Klasyczny wzorzec wygląda następująco: dla każdego elementu pobierz jego miejsce, ustaw wartość domyślną na zero i zwiększ ją.

W ten sposób można zliczać wystąpienia, używając zaledwie jednej linii logiki na element.

use std::collections::HashMap;

fn main() {
    let mut counts = HashMap::new();
    for c in "hello".chars() {
        *counts.entry(c).or_insert(0) += 1;
    }
    println!("l appears {} times", counts[&'l']);
}

or_insert_with

Gdy utworzenie wartości domyślnej jest kosztowne, użyj or_insert_with. Przyjmuje ono closure, które jest wykonywane tylko wtedy, gdy brakuje klucza.

Pozwala to uniknąć tworzenia wartości, która może nigdy nie być potrzebna.

use std::collections::HashMap;

fn main() {
    let mut m: HashMap<&str, Vec<i32>> = HashMap::new();
    m.entry("nums").or_insert_with(Vec::new).push(1);
    m.entry("nums").or_insert_with(Vec::new).push(2);
    println!("{:?}", m["nums"]);
}

and_modify

and_modify wykonuje closure na wartości tylko wtedy, gdy klucz już istnieje.

Połącz je z or_insert, aby obsłużyć oba przypadki: zmodyfikować istniejącą wartość albo wstawić wartość początkową.

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    m.insert("x", 5);
    m.entry("x").and_modify(|v| *v += 10).or_insert(0);
    m.entry("y").and_modify(|v| *v += 10).or_insert(1);
    println!("x={}, y={}", m["x"], m["y"]);
}

or_default

Jeśli typ wartości implementuje Default (na przykład 0 dla liczb całkowitych lub pusty Vec), or_default użyje tej wartości.

Jest to skrócona forma or_insert(Default::default()).

use std::collections::HashMap;

fn main() {
    let mut m: HashMap<&str, i32> = HashMap::new();
    *m.entry("score").or_default() += 7;
    println!("score = {}", m["score"]);
}

Tworzenie list dla poszczególnych kluczy

API entry świetnie sprawdza się przy grupowaniu elementów w wektory.

Dla każdego klucza przy pierwszym wystąpieniu ustaw pusty Vec, a następnie wykonuj push na znajdującym się tam wektorze.

use std::collections::HashMap;

fn main() {
    let mut groups: HashMap<bool, Vec<i32>> = HashMap::new();
    for n in [1, 2, 3, 4] {
        groups.entry(n % 2 == 0).or_default().push(n);
    }
    println!("evens: {:?}", groups[&true]);
}

Dlaczego nie get + insert?

Oddzielne wywołanie get, a następnie insert wyszukuje klucz dwukrotnie i powoduje konflikty z kontrolerem pożyczania.

API entry wykonuje jedno wyszukiwanie i przekazuje dokładnie jedną bezpieczną referencję, dzięki czemu jest szybsze i czytelniejsze.

Połączenie wszystkiego

W tym przykładzie zliczanie i wartość domyślna łączą się, aby określić, ile różnych słów zaczyna się od każdej litery.

Zwróć uwagę na użycie wzorca zliczania w jednym wierszu.

use std::collections::HashMap;

fn main() {
    let words = ["ant", "art", "bee"];
    let mut by_first: HashMap<char, i32> = HashMap::new();
    for w in words {
        *by_first.entry(w.chars().next().unwrap()).or_insert(0) += 1;
    }
    println!("a: {}", by_first[&'a']);
}

Szybkie sprawdzenie

Chcą Państwo zliczać znaki, wykonując jedno wyszukiwanie dla każdego znaku.

Podsumowanie

API entry pozwala wstawić lub zaktualizować wartość za pomocą jednego wyszukiwania.

Używali Państwo or_insert, or_insert_with, or_default i and_modify, aby przejrzyście zliczać elementy i tworzyć listy dla poszczególnych kluczy.

Często zadawane pytania

Czy lekcja „Entry API i wartości domyślne” jest bezpłatna?

Tak — pełny tekst „Entry API i wartości domyślne” 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 „Entry API i wartości domyślne”?

Będzie Pan/Pani ergonomicznie aktualizować wartości. Ć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 2 z 4.

Ile czasu zajmuje lekcja „Entry API i wartości domyślne”?

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. Budowanie HashMap
  2. Entry API i wartości domyślne
  3. Praca z HashSet
  4. Zliczanie i grupowanie
← Powrót do Learn Rust Coding