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
- Budowanie HashMap
- Entry API i wartości domyślne
- Praca z HashSet
- Zliczanie i grupowanie